List<string> myCars = new List<String> { "Yugo", "Aztec", "BMW" };
List<string> yourCars = new List<String> { "BMW", "Saab", "Aztec" };
// Получить общие члены.
var carIntersect =
(from c in myCars select c)
.Intersect(from c2 in yourCars select c2);
Console.WriteLine("Here is what we have in common:");
foreach (string s in carIntersect)
{
Console.WriteLine(s); //
Выводит Aztec и BMW.
}
}
Метод
Union
возвращает результирующий набор, который включает все члены множества запросов LINQ. Подобно любому объединению, даже если общий член встречается более одного раза, повторяющихся значений в результирующем наборе не будет. Следовательно, показанный ниже метод выведет на консоль значения
Yugo
,
Aztec
,
BMW
и
Saab
:
static void DisplayUnion
{
List<string> myCars =
new List<string> { "Yugo", "Aztec", "BMW" };
List<string> yourCars =
new List<String> { "BMW", "Saab", "Aztec" };
// Получить объединение двух контейнеров.
var carUnion =
(from c in myCars select c)
.Union(from c2 in yourCars select c2);
Console.WriteLine("Here is everything:");
foreach (string s in carUnion)
{
Console.WriteLine(s); // Выводит все общие члены.
}
}
Наконец, расширяющий метод
Concat
возвращает результирующий набор, который является прямой конкатенацией результирующих наборов LINQ. Например, следующий метод выводит на консоль результаты
Yugo
,
Aztec
,
BMW
,
Saab
и
Aztec
:
static void DisplayConcat
{
List<string> myCars =
new List<String> { "Yugo", "Aztec", "BMW" };
List<string> yourCars =
new List<String> { "BMW", "Saab", "Aztec" };
var carConcat =
(from c in myCars select c)
.Concat(from c2 in yourCars select c2);
// Выводит Yugo Aztec BMW BMW Saab Aztec.
foreach (string s in carConcat)
{
Console.WriteLine(s);
}
}
Устранение дубликатов
При вызове расширяющего метода
Concat
в результате очень
легко получить избыточные элементы, и зачастую это может быть именно тем, что нужно. Однако в других случаях может понадобиться удалить дублированные элементы данных. Для этого необходимо просто вызвать расширяющий метод
Distinct
:
static void DisplayConcatNoDups
{
List<string> myCars =
new List<String> { "Yugo", "Aztec", "BMW" };
List<string> yourCars =
new List<String> { "BMW", "Saab", "Aztec" };
var carConcat =
(from c in myCars select c)
.Concat(from c2 in yourCars select c2);
// Выводит Yugo Aztec BMW Saab.
foreach (string s in carConcat.Distinct)
{
Console.WriteLine(s);
}
}
Операции агрегирования LINQ
Запросы LINQ могут также проектироваться для выполнения над результирующим набором разнообразных операций агрегирования. Одним из примеров может служить расширяющий метод
Count
. Другие возможности включают получение среднего, максимального, минимального или суммы значений с использованием членов
Приведенные примеры должны предоставить достаточный объем сведений, чтобы вы освоились с процессом построения выражений запросов LINQ. Хотя существуют дополнительные операции, которые пока еще не рассматривались, вы увидите примеры позже в книге, когда речь пойдет о связанных технологиях LINQ. В завершение вводного экскурса в LINQ оставшиеся материалы главы посвящены подробностям отношений между операциями запросов LINQ и лежащей в основе объектной моделью.