Реализация (С# 2). Сортировка List<Product> с использованием интерфейса IComparer <Product>
using System.Collections.Generic;
class ProductNameComparer:IComparer<Product>
{
public int Compare(Product x, Product y)
{
return x.Name.CompareTo(y.Name);
}
}
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.WriteLine();
list.Sort(new ProductNameComparer());
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.Read();
}
Код для компаратора упрощен. В принципе его можно заменить анонимным методом.
list.Sort(delegate(Product x, Product y)
{returnx.Name.CompareTo(y.Name);}
);
Реализация (С# 3). Сортировка списка с использованием делегата Comparison <Product>
Создается экземпляр делегата, который передается методу Sort для выполнения сравнения.
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.WriteLine();
list.Sort(delegate(Product x, Product y)
{
return x.Name.CompareTo(y.Name);
}
);
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.Read();
}
Реализация (С# 3 V2). Сортировка списка с использованием делегата Comparison <Product> из лямбда-выражения
Создание делегата с использованием особого вида синтаксиса (лямбда-выражения)
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.WriteLine();
list.Sort((x,y)=>x.Name.CompareTo(y.Name));
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.Read();
}
Реализация (С# 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();
}
Эволюция:
Слабо типизированный компаратор; нет возможности использовать делегат для сортировки
Строго типизированный компаратор; делегат сравнения
Лямбда-выражения; методы расширения; возможность не изменять список
Пример 3 . Запрос коллекций
Задача: найти все элементы списка, соответствующие заданным критериям (цена товара превышает 10 $)
Реализация (С# 1). Перебор, проверка, отображение
Перебор каждого элемента, его проверка и отображение
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();
}
Ограничения/недостатки:
Из-за вложения инструкций друг в друга появляется зависимость между задачами такими как перебор, проверка, вывод.
Реализация (С# 2). Разделение проверки и отображения.
Создание делегатов test и print, которые впоследствии передаются в соответствующий метод
using System.Collections.Generic;
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
Action<Product> print = Console.WriteLine; // преобразование группы методов (технология v2)