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


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

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

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

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

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

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

Переменные запросов LINQ определены как IEnumerable или как производный тип, например IQueryable. Если переменная запроса имеет тип 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#