Добавить в цитаты Настройки чтения

Страница 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 &lt; 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(&quot;Содержимое массива nums: &quot;);</b>

<b>    foreach (int i in nums)</b>

<b>      Console.Write(i + &quot; &quot;);</b>

<b>    Console.WriteLine();</b>

<b>    // Сначала проверить, содержит ли массив nums отрицательное значение,</b>

<b>    if (Array.Exists(nums, PredDemo.IsNeg)) {</b>

<b>      Console.WriteLine(&quot;Массив nums содержит отрицательное значение.&quot;);</b>

<b>      // Затем найти первое отрицательное значение&quot; в массиве,</b>

<b>      int x = Array.Find(nums, PredDemo.IsNeg);</b>

<b>      Console.WriteLine(&quot;Первое отрицательное значение: &quot; + x);</b>

<b>    }</b>

<b>    else</b>

<b>      Console.WriteLine(&quot;В массиве nums отсутствуют отрицательные значения.&quot;);</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&lt;T&gt; (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 + &quot; &quot;);</b>

<b>  }</b>

<b>  // Еще один метод делегата Action, делающий</b>