Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Эта программа дает следующий результат.Исходный порядок следования: 1 2 3 4 5Обратный порядок следования: 5 4 3 2 1Частично обращенный порядок следования: 5 2 3 4 1
Копирование массива
Полное или частичное копирование одного массива в другой — это еще одна весьма распространенная операция с массивами. Для копирования содержимого массиваслужит метод Сору(). В зависимости от его варианта копирование элементов исходного массива осуществляется в начало или в средину целевого массива. Применениеметода Сору() демонстрируется в приведенном ниже примере программы.// Скопировать массив.using System;class CopyDemo { static void Main() { int[] source = { 1, 2, 3, 4, 5 }; int[] target = { 11, 12, 13, 14, 15 }; int[] source2 = { -1, -2, -3, -4, -5 }; // Отобразить исходный массив. Console.Write("Исходный массив: "); foreach(int i in source) Console.Write(i + " "); Console.WriteLine(); // Отобразить исходное содержимое целевого массива. Console.Write("Исходное содержимое целевого массива: "); foreach(int i in target) Console.Write(i,+ " "); Console.WriteLine(); // Скопировать весь массив. Array.Copy(source, target, source.Length); // Отобразить копию. Console.Write("Целевой массив после копирования: "); foreach(int i in target) Console.Write(i + " "); Console.WriteLine(); // Скопировать в средину целевого массива. Array.Copy(source2, 2, target, 3, 2); // Отобразить копию. Console.Write("Целевой массив после частичного копирования: "); foreach(int i in target) Console.Write(i + " "); Console.WriteLine(); }}
Выполнение этой программы дает следующий результат.Исходный массив: 1 2 3 4 5Исходное содержимое целевого массива: 11 12 13 14 15Целевой массив после копирования: 1 2 3 4 5Целевой массив после частичного копирования: 1 2 3 -3 -4Применение предиката
Предикат представляет собой делегат типа System.Predicate, возвращающийлогическое значение true иди false в зависимости от некоторого условия. Он объявляется следующим образом.public delegate bool Predicate<T> (T obj)
Объект, проверяемый по заданному условию, передается в качестве параметраobj. Если объект obj удовлетворяет заданному условию, то предикат должен возвратить логическое значение true, в противном случае — логическое значение false.Предикаты используются в ряде методов класса Array, включая: Exists(), Find(),FindIndex() и FindAll().
В приведенном ниже примере программы демонстрируется применение предиката с целью определить, содержится ли в целочисленном массиве отрицательное значение. Если такое значение обнаруживается, то данная программа извлекает первоеотрицательное значение, найденное в массиве. Для этого в ней используются методыExists() и Find().// Продемонстрировать применение предикатного делегата.using System;class PredDemo { // Предикатный метод, возвращающий логическое значение true, // если значение переменной v оказывается отрицательным. static bool IsNeg(int v) { if(v < 0) return true; return false; } static void Main() { int[] nums = { 1, 4, -1, 5, -9 }; Console.Write("Содержимое массива nums: "); foreach(int i in nums) Console.Write(i + " "); Console.WriteLine(); // Сначала проверить, содержит ли массив nums отрицательное значение. if(Array.Exists(nums, PredDemo.IsNeg)) { Console.WriteLine("Массив nums содержит отрицательное значение."); // Затем найти первое отрицательное значение в массиве. int х = Array.Find(nums, PredDemo.IsNeg); Console.WriteLine("Первое отрицательное значение: " + x); } else Console.WriteLine("В массиве nums отсутствуют отрицательные значения."); }}
Эта программа дает следующий результат.Содержимое массива nums: 1 4 -1 5 -9Массив nums содержит отрицательное значение.Первое отрицательное значение: -1
В данном примере программы в качестве предиката методам Exists() и Find()передается метод IsNeg(). Обратите внимание на следующее объявление методаIsNeg().static bool IsNeg(int v) {
Методы Exists() и Find() автоматически и по порядку передают элементы массива переменной v. Следовательно, после каждого вызова метода IsNeg() переменнаяv будет содержать следующий элемент массива.Применение делегата Action
Делегат Action применяется в методе Array.ForEach() для выполнения заданногодействия над каждым элементом массива. Существуют разные формы делегата Action,отличающиеся числом параметров типа. Ниже приведена одна из таких форм.public delegate void Action<T> (T obj)
В этой форме объект, над которым должно выполняться действие, передается в качестве параметра obj. Когда же эта форма делегата Action применяется в методеArray.ForEach(), то каждый элемент массива передается по порядку объекту obj.Следовательно, используя делегат Action и метод ForEach(), можно в одном операторе выполнить заданную операцию над целым массивом.
В приведенном ниже примере программы демонстрируется применение делегатаAction и метода ForEach(). Сначала в ней создается массив объектов класса MyClass,а затем используется метод Show() для отображения значений, извлекаемых из этогомассива. Далее эти значения становятся отрицательными с помощью метода Neg().И наконец, метод Show() используется еще раз для отображения отрицательных значений. Все эти операции выполняются посредством вызовов метода ForEach().// Продемонстрировать применение делегата Action.using System;class MyClass { public int i; public MyClass(int x) { i = x; }}class ActionDemo { // Метод делегата Action, отображающий значение, которое ему передается. static void Show(MyClass о) { Console.Write(о.i + " "); } // Еще один метод делегата Action, делающий // отрицательным значение, которое ему передается. static void Neg(MyClass о) { o.i = -o.i; } static void Main() { MyClass[] nums = new MyClass[5]; nums[0] = new MyClass(5); nums[1] = new MyClass(2); nums[2] = new MyClass(3), nums[3] = new MyClass(4); nums[4] = new MyClass(1); Console.Write("Содержимое массива nums: "); // Выполнить действие для отображения значений. Array.ForEach(nums, ActionDemo.Show); Console.WriteLine(); // Выполнить действие для отрицания значений. Array.ForEach(nums, ActionDemo.Neg); Console.Write("Содержимое массива nums после отрицания: "); // Выполнить действие для повторного отображения значений. Array.ForEach(nums, ActionDemo.Show); Console.WriteLine(); }}
Ниже приведен результат выполнения этой программы.Содержимое массива nums: 5 2 3 4 1Содержимое массива nums после отрицания: -5 -2 -3 -4 -1Класс BitConverter
В программировании нередко требуется преобразовать встроенный тип данныхв массив байтов. Допустим, что на некоторое устройство требуется отправить целоезначение, но сделать это нужно отдельными байтами, передаваемыми по очереди.Часто возникает и обратная ситуация, когда данные получаются из устройства в видеупорядоченной последовательности байтов, которые требуется преобразовать в одиниз встроенных типов. Для подобных преобразований в среде .NET предусмотрен отдельный класс BitConverter.
Класс BitConverter является статическим. Он содержит методы, приведенныев табл. 21.13. Кроме того, в нем определено следующее поле.public static readonly bool IsLittleEndian
Это поле принимает логическое значение true, если в текущей среде сначала сохраняется младший байт слова, а затем старший. Это так называемый формат с прямым порядком байтов. А если в текущей среде сначала сохраняется старший байтслова, а затем младший, то поле IsLittleEndian принимает логическое значениеfalse. Это так называемый формат с обратным порядком байтов. В компьютерахс процессором Intel Pentium используется формат с прямым порядком байтов.
Таблица 21.13. Методы, определенные в классе BitConverterМетодНазначениеpublic static long DoubleToInt64Bits(double value)Преобразует значение value в целочисленное значение типа long и возвращает результатpublic static byte[] GetBytes(bool value)Преобразует значение value в однобайтовый массив и возвращает результатpublic static byte[] GetBytes(char value)Преобразует значение value в двухбайтовый массив и возвращает результатpublic static byte[] GetBytes(double value)Преобразует значение value в восьмибайтовый массив и возвращает результатpublic static byte[] GetBytes(float value)Преобразует значение value в четырехбайтовый массив и возвращает результатpublic static byte[] GetBytes(int value)Преобразует значение value в четырехбайтовый массив и возвращает результатpublic static byte[] GetBytes(long value)Преобразует значение value в восьмибайтовый массив и возвращает результатpublic static byte[] GetBytes(short value)Преобразует значение value в двухбайтовый массив и возвращает результатpublic static byte[] GetBytes(uint value)Преобразует значение value в четырехбайтовый массив и возвращает результатpublic static byte[] GetBytes(ulong value)Преобразует значение value в восьмибайтовый массив и возвращает результатpublic static byte[] GetBytes(ushort value)Преобразует значение value в двухбайтовый массив и возвращает результатpublic static double Int64BitsToDouble(long value)Преобразует значение value в значение типа double и возвращает результатpublic static bool ToBoolean(byte[] value, int startIndex)Преобразует байт из элемента массива, указываемого по индексу value[startIndex], в эквивалентное значение типа bool и возвращает результат. Ненулевое значение преобразуется в логическое значение true, а нулевое — в логическое значение falsepublic static char ToChar(byte[] value, int index)Преобразует два байта, начиная с элемента массива value[index], в эквивалентное значение типа char и возвращает результатpublic static double ToDouble(byte[] value, int startIndex)Преобразует восемь байтов, начиная с элемента массива value[startIndex], в эквивалентное значение типа double и возвращает результатpublic static short ToInt16(byte[] value, int startIndex)Преобразует два байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа short и возвращает результатpublic static int ToInt32(byte[] value, int startIndex)Преобразует четыре байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа int и возвращает результатpublic static long ToInt64(byte[] value, int startIndex)Преобразует восемь байтов, начиная с элемента массива value[startIndex], в эквивалентное значение типа long и возвращает результатpublic static float ToSingle(byte[] value, int startIndex)Преобразует четыре байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа float и возвращает результатpublic static string ToString(byte[] value)Преобразует байты из массива value в символьную строку. Строка содержит шестнадцатеричные значения, связанные с этими байтами и разделенные дефисамиpublic static string ToString(byte[] value, int startIndex)Преобразует байты из массива value в символьную строку, начиная с элемента value[startIndex]. Строка содержит шестнадцатеричные значения, связанные с этими байтами и разделенные дефисамиpublic static string ToString(byte[] value, int startIndex, int length)Преобразует байты из массива value в символьную строку, начиная с элемента value[startIndex] и включая число элементов, определяемых параметром length. Строка содержит шестнадцатеричные значения, связанные с этими байтами и разделенные дефисамиpublic static ushort ToUInt16(byte[] value, int startIndex)Преобразует два байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа ushort и возвращает результатpublic static uint ToUInt32(byte[] value, int startIndex)Преобразует четыре байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа uint и возвращает результатpublic static ulong ToUInt64(byte[] value, int startIndex)Преобразует восемь байтов, начиная с элемента массива value[startIndex], в эквивалентное значение типа ulong и возвращает результатГенерирование случайных чисел средствами класса Random