LINQ и универсальные типы (C#)

Запросы LINQ основаны на универсальных типах, которые впервые были представлены в .NET Framework версии 2.0. Для написания запросов не требуется глубокое знание универсальных шаблонов. Но понимание двух основных понятий может пригодиться.

  1. При создании экземпляра класса универсальной коллекции, например List<T>, "T" заменяется типом объектов, которые будут храниться в списке. Например, список строк выражается как List<string>, а список объектов Customer выражается как List<Customer>. Универсальный список является строго типизированным и предоставляет множество преимуществ над коллекциями, которые хранят свои элементы как Object. При попытке добавить Customer к List<string> возникнет ошибка во время компиляции. Использование универсальных коллекций не вызывает сложностей, поскольку не нужно выполнять приведение типов во время выполнения.

  2. IEnumerable<T> является интерфейсом, который позволяет классам универсальных коллекций поддерживать перечисление с помощью оператора foreach. Классы универсальных коллекций поддерживают IEnumerable<T> так же, как не универсальные классы коллекций, например ArrayList, поддерживают IEnumerable.

Дополнительные сведения об универсальных шаблонах см. в разделе Универсальные шаблоны (Руководство по программированию на C#).

Переменные IEnumerable<T> в запросах LINQ

Переменные запросов LINQ определены как IEnumerable<T> или как производный тип, например IQueryable<T>. Если переменная запроса имеет тип IEnumerable<Customer>, это означает, что запрос при выполнении выведет последовательность из нуля или более объектов Customer.

IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

Дополнительные сведения см. в разделе Отношения между типами в операциях запросов LINQ (C#).

Использование компилятора для обработки объявлений универсальных типов

При желании обычного синтаксиса универсальных шаблонов можно избежать с помощью ключевого слова var. Ключевое слово var сообщает компилятору о необходимости определения типа переменной запроса с помощью просмотра источника данных, указанного в предложении from. В следующем примере создается тот же самый скомпилированный код, что и в предыдущем примере.

var customerQuery2 = 
    from cust in customers
    where cust.City == "London"
    select cust;

foreach(var customer in customerQuery2)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

Ключевое слово var удобно, когда тип переменной является очевидным, или когда не требуется явно указывать вложенные универсальные типы, например создаваемые запросами group. В целом, если используется var, важно осознавать, что код может быть более сложным для чтения. Дополнительные сведения см. в разделе Неявно типизированные локальные переменные (Руководство по программированию в C#).

См. также

Ссылки

Универсальные шаблоны (Руководство по программированию на C#)

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

Приступая к работе с LINQ в C#