Страница 365 из 502
В приведенном ниже примере программы демонстрируется применение предиката с целью определить, содержится ли в целочисленном массиве отрицательное значение. Если такое значение обнаруживается, то данная программа извлекает первое отрицательное значение, найденное в массиве. Для этого в ней используются методы Exists() и Find().
<b>//Подемострировать применеие предикатного делегата</b>
<b>using System;</b>
<b>class PredDemo {</b>
<b> // Предикатный метод, возвращающий логическое значение true,</b>
<b> // если значение переменной v оказывается отрицательным,</b>
<b> static bool IsNeg(int v) {</b>
<b> if (v < 0) return true;</b>
<b> return false;</b>
<b> }</b>
<b> static void Main() {</b>
<b> int[] nums = { 1, 4, -1, 5, -9 };</b>
<b> Console.Write("Содержимое массива nums: ");</b>
<b> foreach (int i in nums)</b>
<b> Console.Write(i + " ");</b>
<b> Console.WriteLine();</b>
<b> // Сначала проверить, содержит ли массив nums отрицательное значение,</b>
<b> if (Array.Exists(nums, PredDemo.IsNeg)) {</b>
<b> Console.WriteLine("Массив nums содержит отрицательное значение.");</b>
<b> // Затем найти первое отрицательное значение" в массиве,</b>
<b> int x = Array.Find(nums, PredDemo.IsNeg);</b>
<b> Console.WriteLine("Первое отрицательное значение: " + x);</b>
<b> }</b>
<b> else</b>
<b> Console.WriteLine("В массиве nums отсутствуют отрицательные значения.");</b>
<b> }</b>
<b>}</b>
Эта программа дает следующий результат.
<b>Содержимое массива nums: 1 4 -1 5 -9</b>
<b>Массив nums содержит отрицательное значение.</b>
<b>Первое отрицательное значение: -1</b>
В данном примере программы в качестве предиката методам Exists() и Find() передается метод IsNeg(). Обратите внимание на следующее объявление метода IsNeg().
<b>static bool IsNeg (int v) {</b>
Методы Exists() и Find() автоматически и по порядку передают элементы массива переменной v. Следовательно, после каждого вызова метода IsNeg() переменная v будет содержать следующий элемент массива.
Делегат 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().
<b>// Продемонстрировать применение делегата Action.</b>
<b>using System;</b>
<b>class MyClass {</b>
<b> public int i;</b>
<b> public MyClass(int x) {</b>
<b> i = x;</b>
<b> }</b>
<b>}</b>
<b>class ActionDemo {</b>
<b> // Метод делегата Action, отображающий значение, которое ему передается,</b>
<b> static void Show(MyClass о) {</b>
<b> Console.Write(о.i + " ");</b>
<b> }</b>
<b> // Еще один метод делегата Action, делающий</b>