Возможности C#, поддерживающие LINQ
В этом разделе представлены новые конструкции языка C# 3.0. Хотя все эти новые возможности в той или иной степени используются с запросами LINQ, они не привязаны к LINQ и могут использоваться в любом контексте, где будут целесообразны.
Выражения запросов
Выражения запросов используют декларативный синтаксис, аналогичный SQL или XQuery для запросов к коллекциям через интерфейс IEnumerable. При компиляции синтаксис запроса преобразуется в вызовы методов расширения стандартных операторов запросов, реализованные поставщиком LINQ. Приложения управляют стандартными операторами запросов, которые находятся в области действия, за счет указания соответствующего пространства имен с помощью директивы using. Следующее выражение запроса принимает массив строк, группирует их в соответствии с первым знаком в строке и упорядочивает группы.
var query = from str in stringArray
group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
Дополнительные сведения см. в разделе Выражения запросов LINQ (Руководство по программированию на C#).
Неявно типизированные переменные (var)
Вместо явного задания типа при объявлении и инициализации переменной можно использовать модификатор var,чтобы сообщить компилятору о необходимости определить и присвоить тип, как показано ниже.
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str;
Переменные, объявленные как var, так же строго типизированы, как и переменные с явно указанным типом. Использование var дает возможность создавать анонимные типы, но она может применяться и для любых локальных переменных. Массивы также могут быть объявлены с неявным типом.
Дополнительные сведения см. в разделе Неявно типизированные локальные переменные (Руководство по программированию в C#).
Инициализаторы объектов и коллекций
Инициализаторы объектов и коллекций позволяют инициализировать объекты без явного вызова конструктора для объектов. Инициализаторы обычно используются в выражениях запроса при проецировании исходных данных на новый тип данных. Предположим, что класс с именем Customer имеет открытые свойства Name и Phone и инициализатор объекта может использоваться как в следующем коде.
Customer cust = new Customer { Name = "Mike", Phone = "555-1212" };
Дополнительные сведения см. в разделе Инициализаторы объектов и коллекций (Руководство по программированию в C#).
Анонимные типы
Анонимный тип создается компилятором и его имя доступно только компилятору. Анонимные типы предоставляют удобный способ временной группировки набора свойств в результатах запроса без необходимости определения отдельного именованного типа. Анонимные типы инициализируются выражением new и инициализатором объектов, как показано ниже.
select new {name = cust.Name, phone = cust.Phone};
Дополнительные сведения см. в разделе Анонимные типы (Руководство по программированию в C#).
К методам расширения
Метод расширения представляет собой статический метод, который может быть связан с типом так, что он может быть вызван, как если бы он был методом экземпляра этого типа. Эта возможность позволяет, по сути, "добавить" новые методы в существующие типы, фактически не изменяя их. Стандартные операторы запросов представляют собой набор методов расширения, предоставляющих функциональные возможности запроса LINQ для любого типа, который реализует IEnumerable.
Дополнительные сведения см. в разделе Методы расширения (Руководство по программированию в C#).
Лямбда-выражения
Лямбда-выражение является встроенной функцией, использующей оператор => для отделения входных параметров от основной части функции, и может быть преобразована во время компиляции в делегат или дерево выражения. В программировании LINQ лямбда-выражения встречаются при использовании прямых вызовов стандартных операторов запросов.
Дополнительные сведения см. в следующих разделах.
Автоматически реализуемые свойства
Автоматически реализуемые свойства делают объявление свойств более кратким. При объявлении свойств, как показано в следующем примере, компилятор создаст закрытое, анонимное резервное поле, которое доступно исключительно с помощью методов get и set свойства.
public string Name {get; set;}
Дополнительные сведения см. в разделе Автоматически реализуемые свойства (Руководство по программированию на C#).
См. также
Основные понятия
Возможности Visual Basic, поддерживающие LINQ