Шрифт:
Интервал:
Закладка:
Рассмотрим другой пример. Но сначала приведем еще раз запрос из представленного ранее примера применения оператора 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() для составления списка
// наименований товаров и состояния их запасов на складе,
var inStockList = items.Join(statusList,
kl => kl.ItemNumber,
k2 => k2.ItemNumber,
(kl, k2) => new Temp(kl.Name, k2.InStock) );
В данном варианте именованный класс Temp используется для хранения результирующего объекта, но вместо него можно воспользоваться анонимным типом. Такой вариант запроса приведен ниже.
var inStockList = items.Join(statusList,
kl => kl.ItemNumber,
k2 => k2.ItemNumber,
(kl, k2) => new { kl.Name, k2.InStock} );
Синтаксис запросов и методы запросаКак пояснялось в предыдущем разделе, запросы в C# можно формировать двумя способами, используя синтаксис запросов или методы запроса. Любопытно, что оба способа связаны друг с другом более тесно, чем кажется, глядя на исходный код программы. Дело в том, что синтаксис запросов компилируется в вызовы методов запроса. Поэтому код
where х < 10
будет преобразован компилятором в следующий вызов.
Where(х => х < 10)
Таким образом, оба способа формирования запросов в конечном итоге сходятся на одном и том же.
Но если оба способа оказываются в конечном счете равноценными, то какой из них лучше для программирования на С#? В целом, рекомендуется чаще пользоваться синтаксисом запросов, поскольку он полностью интегрирован в язык С#, поддерживается соответствующими ключевыми словами и синтаксическим конструкциями.
Дополнительные методы расширения, связанные с запросамиПомимо методов, соответствующих операторам запроса, поддерживаемым в С#, име-ется ряд других методов расширения, связанных с запросами и зачастую оказывающих помощь в формировании запросов. Эти методы предоставляются в среде .NET Framework и определены для интерфейса IEnumerable<T> в классе Enumerable. Ниже приведены наиболее часто используемые методы расширения, связанные с запросами. Многие из них могут перегружаться, поэтому они представлены лишь в самой общей форме.
Метод Описание
All(predicate) Возвращает логическое значение true,
если все элементы в последовательности
удовлетворяют условию, задаваемому параметром
predicate
Any(predicate) Возвращает логическое значение true, если
любой элемент в последовательности удовлетворяет
условию, задаваемому параметром predicate
Average() Возвращает среднее всех значений в числовой
последовательности
Contains(value) Возвращает логическое значение true, если
в последовательности содержится указанный объект
Count() Возвращает длину последовательности, т.е.
количество составляющих ее элементов
First() Возвращает первый элемент в последовательности
Last() Возвращает последний элемент в последовательности
Max() Возвращает максимальное значение в
последовательности
Min() Возвращает минимальное значение в
последовательности
Sum() Возвращает сумму значений в числовой
последовательности
Метод Count() уже демонстрировался ранее в этой главе. А в следующей программе демонстрируются остальные методы расширения, связанные с запросами.
// Использовать ряд методов расширения, определенных в классе Enumerable.
using System;
using System.Linq;
class ExtMethods {
static void Main() {
int[] nums = { 3, 1, 2, 5, 4 };
Console.WriteLine("Минимальное значение равно " + nums.Min());
Console.WriteLine("Максимальное значение равно " + nums.Max());
Console.WriteLine("Первое значение равно " + nums.First());
Console.WriteLine("Последнее значение равно " + nums.Last());
Console.WriteLine("Суммарное значение равно " + nums.Sum());
Console.WriteLine("Среднее значение равно " + nums.Average());
if(nums.All(n => n > 0))
Console.WriteLine("Все значения больше нуля.");
if(nums.Any(n => (n % 2) == 0))
Console.WriteLine("По крайней мере одно значение является четным.");
if(nums.Contains(3))
Console.WriteLine("Массив содержит значение 3.");
}
}
Вот к какому результату приводит выполнение этой программы.
Минимальное значение равно 1
Максимальное значение равно 5
Первое значение равно 3
Последнее значение равно 4
Суммарное значение равно 15
Среднее значение равно 3
Все значения больше нуля.
По крайней мере одно значение является четным
Массив содержит значение 3.
Методы расширения, связанные с запросами, можно также использовать в самом запросе, основываясь на синтаксисе запросов, предусмотренном в С#. И в действительности это делается очень часто. Например, метод Average() используется в приведенной ниже программе для получения последовательности, состоящей только из тех значений, которые оказываются меньше среднего всех значений в массиве.
// Использовать метод Average() вместе с синтаксисом запросов.
using System;
using System.Linq;
class ExtMethods2 {
static void Main() {
int[] nums = { 1, 2, 4, 8, 6, 9, 10, 3, 6, 7 };
var ItAvg = from n in nums
let x = nums.Average()
where n < x
select n;
Console.WriteLine("Среднее значение равно " + nums.Average());
Console.Write("Значения меньше среднего: ");
// Выполнить запрос и вывести его результаты,
foreach(int i in ItAvg) Console.Write(i + " ");
Console.WriteLine();
}
}
При выполнении этой программы получается следующий результат.
Среднее значение равно 5.6
Значения меньше среднего: 1 2 4 3
Обратите особое внимание в этой программе на следующий код запроса.
var ItAvg = from n in nums
let x = nums.Average()
where n < x
select n;
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ. РУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ - ГОССТАНДАРТ РОССИИ - Программирование
- Управление исходными текстами. Часть 1. Краткое руководство по CVS - Илья Рыженков - Программирование
- Гибкое управление проектами и продуктами - Борис Вольфсон - Программирование
- Каждому проекту своя методология - Алистэр Коуберн - Программирование
- Разработка ядра Linux - Роберт Лав - Программирование
- Как спроектировать современный сайт - Чои Вин - Программирование
- Творческий отбор. Как создавались лучшие продукты Apple во времена Стива Джобса - Кен Косиенда - Прочая околокомпьтерная литература / Интернет / Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование