Положительные значения из массива nums: 1 3 5
Обратите особое внимание в данной программе на следующую строку кода.
var posNums = nums.Where(n => n > 0).Select(r => r);
В этой строке кода формируется запрос, сохраняемый в переменной posNums
. По этому запросу, в свою очередь, формируется последовательность положительных значений, извлекаемых из массива nums
. Для этой цели служит метод Where()
, отбирающий запрашиваемые значения, а также метод Select()
, избирательно формирующий из этих значений окончательный результат. Метод Where()
может быть вызван для массива nums
, поскольку во всех массивах реализуется интерфейс IEnumerable
, поддерживающий методы расширения запроса.
Формально метод Select()
в рассматриваемом здесь примере не нужен, поскольку это простой запрос. Ведь последовательность, возвращаемая методом Where()
, уже содержит конечный результат. Но окончательный выбор можно сделать и по более сложному критерию, как это было показано ранее на примерах использования синтаксиса запросов. Так, по приведенному ниже запросу из массива nums
возвращаются положительные значения, увеличенные на порядок величины.
var posNums = nums.Where(n => n > 0) .Select (r => r * 10);
Как и следовало ожидать, в цепочку можно объединять и другие операции над данными, получаемыми по запросу. Например, по следующему запросу выбираются положительные значения, которые затем сортируются по убывающей и возвращаются в виде результирующей последовательности:
var posNums = nums.Where(n => n > 0).OrderByDescending(j => j);
где выражение j => j
обозначает, что упорядочение зависит от входного параметра, который является элементом данных из последовательности, получаемой из метода Where()
.
В приведенном ниже примере демонстрируется применение метода запроса GroupBy()
. Это измененный вариант представленного ранее примера.
// Продемонстрировать применение метода запроса GroupBy().
// Это переработанный вариант примера, представленного ранее
// для демонстрации синтаксиса запросов.
using System;
using System.Linq;
class GroupByDemo {
static void Main() {
string[] websites = {
"hsNameA.com", "hsNameB.net", "hsNameC.net",
"hsNameD.com", "hsNameE.org", "hsNameF.org",
"hsNameG.tv", "hsNameH.net", "hsNamel.tv"
};
// Использовать методы запроса для группирования
// веб-сайтов по имени домена самого верхнего уровня.
var webAddrs = websites.Where(w => w.LastIndexOf('.') != 1).
GroupBy(x => x.Substring(x.LastIndexOf(".", x.Length)));
// Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {
foreach (var sites in webAddrs) {
Console.WriteLine("Веб-сайты, сгруппированные " +
"по имени домена " + sites.Key);
foreach (var site in sites)
Console.WriteLine(" " + site);
Console.WriteLine();
}
}
}
Эта версия программы дает такой же результат, как и предыдущая. Единственное отличие между ними заключается в том, как формируется запрос. В данной версии для этой цели используются методы запроса.
Рассмотрим другой пример. Но сначала приведем еще раз запрос из представленного ранее примера применения оператора join
.
var inStockList = from item in items
join entry in statusList
on item.ItemNumber equals entry.ItemNumber
select new Temp(item.Name, entry.InStock);
По этому запросу формируется последовательность, состоящая из объектов, инкапсулирующих наименование товара и состояние его запасов на складе. Вся эта информация получается путем объединения двух источников данных: items
и statusList
. Ниже приведен переделанный вариант данного запроса, в котором вместо синтаксиса, предусмотренного в C# для запросов, используется метод запроса Join()
.
// Использовать метод запроса Join() для составления списка