Язык программирования C#9 и платформа .NET5
public string Description {get; set;} = "";public int NumberInStock {get; set;} = 0;public override string ToString()=> $"Name={Name}, Description={Description},Number in Stock={NumberInStock}";}}Теперь заполните массив объектами
в вызывающем коде:ProductInfoConsole.WriteLine("***** Fun with Query Expressions *****\n");// Этот массив будет основой для тестирования...ProductInfo[] itemsInStock = new[] {new ProductInfo{ Name = "Mac's Coffee",Description = "Coffee with TEETH", NumberInStock = 24},new ProductInfo{ Name = "Milk Maid Milk",Description = "Milk cow's love", NumberInStock = 100},new ProductInfo{ Name = "Pure Silk Tofu",Description = "Bland as Possible", NumberInStock = 120},new ProductInfo{ Name = "Crunchy Pops",Description = "Cheezy, peppery goodness",NumberInStock = 2},new ProductInfo{ Name = "RipOff Water",Description = "From the tap to your wallet",NumberInStock = 100},new ProductInfo{ Name = "Classic Valpo Pizza",Description = "Everyone lovespizza!", NumberInStock = 73}};// Здесь мы будем вызывать разнообразные методы!Console.ReadLine();Базовый синтаксис выборки
Поскольку синтаксическая корректность выражения запроса LINQ проверяется на этапе компиляции, вы должны помнить, что порядок следования операций критически важен. В простейшем виде каждый запрос LINQ строится с использованием операций
,fromиin. Вот базовый шаблон, который нужно соблюдать:select<i>var результат =</i><i> from сопоставляемыйЭлемент in контейнер</i><i> select сопоставляемыйЭлемент;</i>Элемент после операции
представляет элемент, соответствующий критерию запроса LINQ; именовать его можно по своему усмотрению. Элемент после операции in представляет контейнер данных, в котором производится поиск (массив, коллекция, документ XML и т.д.).fromРассмотрим простой запрос, не делающий ничего кроме извлечения каждого элемента контейнера (по поведению похожий на SQL-оператор
в базе данных):SELECT *static void SelectEverything(ProductInfo[] products){<b> // Получить все!</b>Console.WriteLine("All product details:");var allProducts = from p in products select p;foreach (var prod in allProducts){Console.WriteLine(prod.ToString());}}По правде говоря, это выражение запроса не особенно полезно, т.к. оно выдает подмножество, идентичное содержимому входного параметра. При желании можно извлечь только значения
каждого товара, применив следующий синтаксис выборки:Namestatic void ListProductNames(ProductInfo[] products){// Теперь получить только наименования товаров.Console.WriteLine("Only product names:");var names = from p in products select p.Name;foreach (var n in names){Console.WriteLine("Name: {0}", n);}}Получение подмножества данных
Чтобы получить определенное подмножество из контейнера, можно использовать операцию
. Общий шаблон запроса становится таким:where<i>var результат =</i><i> from элемент in контейнер</i><i> where булевскоеВыражение</i><i> select элемент;</i>Обратите внимание, что операция where ожидает выражение, результатом вычисления которого является булевское значение. Например, чтобы извлечь из аргумента
только товарные позиции, складские запасы которых составляют более 25 единиц, можно написать следующий код:ProductInfo[]static void GetOverstock(ProductInfo[] products){Console.WriteLine("The overstock items!");// Получить только товары со складским запасом более 25 единиц.var overstock =from pin productswhere p.NumberInStock > 25select p;foreach (ProductInfo c in overstock)