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

Обновлен: Ноябрь 2007

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

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

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

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

Bb762913.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

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

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

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

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

См. также

Основные понятия

Общие сведения об универсальных шаблонах в .NET Framework

Универсальные коллекции в .NET Framework

Универсальные интерфейсы

Преимущества и ограничения универсальных шаблонов

Ссылки

System.Collections.Generic

System.Collections.ObjectModel

Другие ресурсы

Универсальные шаблоны в платформе .NET Framework