Поделиться через


Универсальные делегаты для управления массивами и списками

В этом разделе содержится обзор универсальных делегатов для преобразований, предикатов поиска и действий, осуществляемых с элементами массива или коллекции.

Универсальные делегаты для управления массивами и списками

Универсальный делегат Action<T> представляет метод, выполняющий некоторое действие с элементом указанного типа. Можно создать метод, выполняющий нужное действие с элементом, создать экземпляр делегата Action<T> для представления этого метода, а затем передать массив и делегат в статический универсальный метод Array.ForEach. Метод вызывается для каждого элемента массива.

Универсальный класс List<T> также предоставляет метод ForEach, использующий делегат Action<T>. Этот метод неуниверсальный.

Примечание.

Это интересная особенность универсальных типов и методов. Метод Array.ForEach должен быть статическим (Shared в Visual Basic) и универсальным, так как Array не является универсальным типом. Единственной причиной, по которой можно задать тип для Array.ForEach, является то, что метод имеет свой собственный список параметров типа. Напротив, неуниверсальный метод List<T>.ForEach принадлежит к универсальному классу List<T>, поэтому он просто использует параметр типа своего класса. Класс является строго типизированным, поэтому этот метод может быть методом экземпляра.

Универсальный делегат Predicate<T> представляет метод, который определяет, удовлетворяет ли конкретный элемент заданным критериям. Его можно использовать со следующими статическими универсальными методами Array для поиска элемента или набора элементов: Exists, Find, FindAll, FindIndex, FindLast, FindLastIndex и TrueForAll.

Predicate<T> также работает с соответствующими неуниверсальными методами экземпляра универсального класса List<T>.

Универсальный делегат Comparison<T> позволяет указать порядок сортировки для элементов массива или списка, для которых нет собственного порядка сортировки, или переопределить их собственный порядок сортировки. Создайте метод, выполняющий сравнение, создайте экземпляр делегата Comparison<T> для представления этого метода, а затем передайте массив и делегат в статический универсальный метод Array.Sort<T>(T[], Comparison<T>). Универсальный класс List<T> предоставляет соответствующий перегруженный метод экземпляра List<T>.Sort(Comparison<T>).

Универсальный делегат Converter<TInput,TOutput> позволяет определить преобразование между двумя типами и преобразовать массив одного типа в массив другого типа (либо преобразовать список одного типа в список другого типа). Создайте метод, преобразующий элементы существующего списка в новый тип, создайте экземпляр делегата, который будет представлять метод, и используйте универсальный статический метод Array.ConvertAll для создания массива нового типа из исходного массива или универсальный метод экземпляра List<T>.ConvertAll<TOutput>(Converter<T,TOutput>) для создания списка нового типа из исходного списка.

Связывание делегатов

Многие методы, использующие эти делегаты, возвращают массив или список, который можно передать другому методу. Например, если вы хотите выбрать определенные элементы массива, преобразовать их в новый тип и сохранить в новый массив, вы можете передать массив, возвращенный универсальным методом FindAll, в универсальный метод ConvertAll. Если у нового типа элементов нет естественного порядка сортировки, вы можете передать массив, возвращенный универсальным методом ConvertAll, в универсальный метод Sort<T>(T[], Comparison<T>).

См. также