LINQ и универсальные типы (C#)
Запросы LINQ основаны на универсальных типах, которые впервые были представлены в .NET Framework версии 2.0. Для написания запросов не требуется глубокое знание универсальных шаблонов. Но понимание двух основных понятий может пригодиться.
При создании экземпляра класса универсальной коллекции, например List<T>, "T" заменяется типом объектов, которые будут храниться в списке. Например, список строк выражается как List<string>, а список объектов Customer выражается как List<Customer>. Универсальный список является строго типизированным и предоставляет множество преимуществ над коллекциями, которые хранят свои элементы как Object. При попытке добавить Customer к List<string> возникнет ошибка во время компиляции. Использование универсальных коллекций не вызывает сложностей, поскольку не нужно выполнять приведение типов во время выполнения.
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#)