Язык программирования C#9 и платформа .NET5
static void GetNamesAndDescriptionsTyped(ProductInfo[] products){Console.WriteLine("Names and Descriptions:");IEnumerable<ProductInfoSmall> nameDesc =from pin productsselect new ProductInfoSmall{ Name=p.Name, Description=p.Description };foreach (ProductInfoSmall item in nameDesc){Console.WriteLine(item.ToString());}}При проецировании LINQ у вас есть выбор, какой метод использовать (в анонимные или в строго типизированные объекты). Решение, которое вы примете, полностью зависит от имеющихся бизнес-требований.
Подсчет количества с использованием класса Enumerable
Во время проецирования новых пакетов данных у вас может возникнуть необходимость выяснить количество элементов, возвращаемых внутри последовательности. Для определения числа элементов, которые возвращаются из выражения запроса LINQ, можно применять расширяющий метод
классаCount(). Например, следующий метод будет искать в локальном массиве все объектыEnumerable, которые имеют длину, превышающую шесть символов, и выводить их количество:stringstatic void GetCountFromQuery(){string[] currentVideoGames = {"Morrowind", "Uncharted 2","Fallout 3", "Daxter", "SystemShock 2"};// Получить количество элементов из запроса.int numb =(from g in currentVideoGames where g.Length > 6 select g).Count();// Вывести количество элементов.Console.WriteLine("{0} items honor the LINQ query.", numb);}Изменение порядка следования элементов в результирующих наборах на противоположный
Изменить порядок следования элементов в результирующем наборе на противоположный довольно легко с помощью расширяющего метода
классаReverse<T>(). Например, в показанном далее методе выбираются все элементы из входного параметраEnumerableв обратном порядке:ProductInfo[]static void ReverseEverything(ProductInfo[] products){Console.WriteLine("Product in reverse:");var allProducts = from p in products select p;foreach (var prod in allProducts.Reverse()){Console.WriteLine(prod.ToString());}}Выражения сортировки
В начальных примерах настоящей главы вы видели, что в выражении запроса может использоваться операция
для сортировки элементов в подмножестве по заданному значению. По умолчанию принят порядок по возрастанию, поэтому строки сортируются в алфавитном порядке, числовые значения — от меньшего к большему и т.д. Если вы хотите просматривать результаты в порядке по убыванию, просто включите в выражение запроса операциюorderby. Взгляните на следующий метод:descendingstatic void AlphabetizeProductNames(ProductInfo[] products){// Получить названия товаров в алфавитном порядке.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());}}Хотя порядок по возрастанию является стандартным, свои намерения можно прояснить, явно указав операцию
:ascendingvar subset = from p in products orderby p.Name ascending select p;Для получения элементов в порядке убывания служит операция
:descendingvar subset = from p in products orderby p.Name descending select p;LINQ как лучшее средство построения диаграмм Венна
Класс
поддерживает набор расширяющих методов, которые позволяют применять два (или более) запроса LINQ в качестве основы для нахождения объединений, разностей, конкатенаций и пересечений данных. Первым мы рассмотрим расширяющий методEnumerable. Он возвращает результирующий набор LINQ, содержащий разность между двумя контейнерами, которой в этом случае является значениеExcept():Yugostatic 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)