C# 4.0 полное руководство - 2011
Шрифт:
В приведенном ниже примере программы демонстрируется применение предиката с целью определить, содержится ли в целочисленном массиве отрицательное значение. Если такое значение обнаруживается, то данная программа извлекает первое отрицательное значение, найденное в массиве. Для этого в ней используются методы Exists() и Find.
class PredDemo {
// Предикатный метод, возвращающий логическое значение true,
//
}
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: 14-15-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 и метод For Each , можно в одном операторе выполнить заданную операцию над целым массивом.
В приведенном ниже примере программы демонстрируется применение делегата 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[l] = 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);
Ниже приведен результат выполнения этой программы.