static void GetNamesAndDescriptionsTyped(
ProductInfo[] products)
{
Console.WriteLine("Names and Descriptions:");
IEnumerable<ProductInfoSmall> nameDesc =
from p
in products
select new ProductInfoSmall
{ Name=p.Name, Description=p.Description };
foreach (ProductInfoSmall item in nameDesc)
{
Console.WriteLine(item.ToString());
}
}
При проецировании LINQ у вас есть выбор, какой метод использовать (в анонимные или в строго типизированные объекты). Решение, которое вы примете, полностью зависит от имеющихся бизнес-требований.
Подсчет количества с использованием класса Enumerable
Во время проецирования новых пакетов данных у вас может возникнуть необходимость выяснить количество элементов, возвращаемых внутри последовательности. Для определения числа элементов, которые возвращаются из выражения запроса LINQ, можно применять расширяющий метод
Count()
класса
Enumerable
. Например, следующий метод будет искать в локальном массиве все объекты
string
, которые имеют длину, превышающую шесть символов, и выводить их количество:
static void GetCountFromQuery()
{
string[] currentVideoGames = {"Morrowind", "Uncharted 2",
"Fallout 3", "Daxter", "System
Shock 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
для сортировки элементов в подмножестве по заданному значению. По умолчанию принят порядок по возрастанию, поэтому строки сортируются в алфавитном порядке, числовые значения — от меньшего к большему и т.д. Если вы хотите просматривать результаты в порядке по убыванию, просто включите в выражение запроса операцию
descending
. Взгляните на следующий метод:
static 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());
}
}
Хотя порядок по возрастанию является стандартным, свои намерения можно прояснить, явно указав операцию
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)