Реализация (С# 3). Проверка при помощи лямбра-выражения

Реализация (С# 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. Лямбда-выражение упрощает условие для чтения


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: