Реализация (С# 2). Разделение проверки и отображения.
Реализация (С# 1). Перебор, проверка, отображение
Пример 3. Запрос коллекций
Реализация (С# 3 V3). Сортировка списка с использованием метода расширения
Список не сортируется «на месте», а лишь возвращается в качестве результата содержимое списка в указанном порядке. Вызов метода OrderBy возможен благодаря наличию метода расширения.
using System.Linq;
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.WriteLine();
foreach (Product product in list.OrderBy(p=>p.Name))
Console.WriteLine(product.ToString());
Console.Read();
}
Эволюция:
1. Слабо типизированный компаратор; нет возможности использовать делегат для сортировки
2. Строго типизированный компаратор; делегат сравнения
3. Лямбда-выражения; методы расширения; возможность не изменять список
Задача: найти все элементы списка, соответствующие заданным критериям (цена товара превышает 10 $)
Перебор каждого элемента, его проверка и отображение
using System.Collections;
|
|
static void Main(string[] args)
{
ArrayList list = Product.GetSampleProducts();
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.WriteLine();
foreach (Product product in list)
if (product.Price > 10m)
{
Console.WriteLine(product.ToString());
}
Console.Read();
}
Ограничения/недостатки:
Из-за вложения инструкций друг в друга появляется зависимость между задачами такими как перебор, проверка, вывод.
Создание делегатов test и print, которые впоследствии передаются в соответствующий метод
using System.Collections.Generic;
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
Action<Product> print = Console.WriteLine; // преобразование группы методов (технология v2)
list.ForEach(print);
Console.WriteLine();
Predicate<Product> test = delegate(Product p) { return p.Price > 10m; };
List<Product> matches = list.FindAll(test);
matches.ForEach(print);
Console.Read();
}
Упрощенная запись, абсолютно аналогичная версии выше:
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
list.ForEach(Console.WriteLine);
Console.WriteLine();
list.FindAll(delegate(Product p) { return p.Price > 10m; }).ForEach(Console.WriteLine);
Console.Read();
}
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
list.ForEach(Console.WriteLine);
Console.WriteLine();
foreach (Product product in list.Where(p => p.Price > 10))
{
Console.WriteLine(product);
}
Console.Read();
}
Эволюция:
1. Жесткая связь между условием и действием
2. Условие отдельно от действия; анонимные методы упрощают делегаты
3. Лямбда-выражение упрощает условие для чтения