проецировании LINQ у вас есть выбор, какой метод использовать (в анонимные или в строго типизированные объекты). Решение, которое вы примете, полностью зависит от имеющихся бизнес-требований.
Подсчет количества с использованием класса Enumerable
Во время проецирования новых пакетов данных у вас может возникнуть необходимость выяснить количество элементов, возвращаемых внутри последовательности. Для определения числа элементов, которые возвращаются из выражения запроса LINQ, можно применять расширяющий метод
Count
класса
Enumerable
. Например, следующий метод будет искать в локальном массиве все объекты
string
, которые имеют длину, превышающую шесть символов, и выводить их количество:
В начальных примерах настоящей главы вы видели, что в выражении запроса может использоваться операция
orderby
для сортировки элементов в подмножестве по заданному значению. По умолчанию принят порядок по
возрастанию, поэтому строки сортируются в алфавитном порядке, числовые значения — от меньшего к большему и т.д. Если вы хотите просматривать результаты в порядке по убыванию, просто включите в выражение запроса операцию
// Получить названия товаров в алфавитном порядке.
var subset = from p in products orderby p.Name select p;
Console.WriteLine("Ordered by Name:");
foreach (var p in subset)
{
Console.WriteLine(p.ToString);
}
}
Хотя порядок по возрастанию является стандартным, свои намерения можно прояснить, явно указав операцию
ascending
:
var subset = from p in products orderby p.Name ascending select p;
Для получения элементов в порядке убывания служит операция
descending
:
var subset = from p in products orderby p.Name descending select p;
LINQ как лучшее средство построения диаграмм Венна
Класс
Enumerable
поддерживает набор расширяющих методов, которые позволяют применять два (или более) запроса LINQ в качестве основы для нахождения объединений, разностей, конкатенаций и пересечений данных. Первым мы рассмотрим расширяющий метод
Except
. Он возвращает результирующий набор LINQ, содержащий разность между двумя контейнерами, которой в этом случае является значение
Yugo
:
static void DisplayDiff
{
List<string> myCars =
new List<String> {"Yugo", "Aztec", "BMW"};
List<string> yourCars =
new List<String>{"BMW", "Saab", "Aztec" };
var carDiff =
(from c in myCars select c)
.Except(from c2 in yourCars select c2);
Console.WriteLine("Here is what you don't have, but I do:");
foreach (string s in carDiff)
{
Console.WriteLine(s); // Выводит Yugo.
}
}
Метод
Intersect
возвращает результирующий набор, который содержит общие элементы данных в наборе контейнеров. Например, следующий метод возвращает последовательность из