Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

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
. Другие возможности включают получение среднего, максимального, минимального или суммы значений с использованием членов
Average
,
Мах
,
Min
либо
Sum
класса
Enumerable
. Вот простой пример:

Here is a simple example:static void AggregateOps

{

double[] winterTemps = { 2.0, -21.3, 8, -4, 0, 8.2 };

// Разнообразные примеры агрегации.

// Выводит максимальную температуру:

Console.WriteLine("Max temp: {0}",

(from t in winterTemps select t).Max);

// Выводит минимальную температуру:

Console.WriteLine("Min temp: {0}",

(from t in winterTemps select t).Min);

// Выводит среднюю температуру:

Console.WriteLine("Average temp: {0}",

(from t in winterTemps select t).Average);

// Выводит сумму всех температур:

Console.WriteLine("Sum of all temps: {0}",

(from t in winterTemps select t).Sum);

}

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

Поделиться с друзьями: