Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций (C#).pdf
Скачиваний:
39
Добавлен:
25.03.2016
Размер:
2.43 Mб
Скачать

ЯАП

Смирнов

9.3 Получение результатов с использованием методов

Получением результатов, аналогичных описанным в подразделе 9.2, может быть достигнуто с использованием методов, описанных в интерфейсе IEnumerable<T>1. Фактически, построенный запрос автоматически преобразуется в последовательность вызовов методов данного интерфейса. Соответствие между операторами запроса и методами интерфейса IEnumerable<T> приведено в табли-

це 9.2.

Таблица 9.2 – Соответствие между операторами запроса и методами интер-

фейса IEnumerable<T>

Оператор

Метод интерфейса

запроса

 

select

Select(selector)

where

Where(predicate)

 

 

orderby

OrderBy(keySelector)

 

OrderByDescending(keySelector)

 

ThenBy(keySelector)

 

ThenByDescending(keySelector)

 

 

group

GroupBy(keySelector)

 

 

join

Join(inner, outerKeySelector, innerKeySelector,

 

resultSelector)

 

 

Параметры selector, predicate, keySelector, outerKeySelector, innerKeySelector представляют собой реализацию делегата

public delegate TResult Func<in T, out TResult>(T arg)

Параметр resultSelector представляет собой реализацию делегата

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)

Реализация делегатов может быть выполнена как методом, так и лямбдавыражением.

1 Некоторые из методов упоминались при рассмотрении интерфейса IEnumerable<T>. В данном подразделе упомянутые ранее методы будут рассмотрены еще раз на основе примеров, использующих пользовательские классы.

162

9.3.1 Метод Where

Метод Where(predicate) используется для отбора из последовательности тех элементов, которые удовлетворяют некоторому условию. Для отбора используется predicate – реализация делегата Func, входным параметром которого является элемент последовательности, а выходным – логическое выражение, определяющее, должен ли учитываться данный элемент.

Пример 1: отобрать людей, родившихся после 1980 года (реализация с помощью лямбда-выражения).

People[] Peoples = new People[6];

Peoples[0] = new People() { Surname = "Иванов", YearOfBirth = 1980, City = "Новокузнецк" };

Peoples[1] = new People() { Surname = "Петров", YearOfBirth = 1999, City = "Москва" };

Peoples[2] = new People() { Surname = "Иванов", YearOfBirth = 1971, City = "Псков" };

Peoples[3] = new People() { Surname = "Степанов", YearOfBirth = 1980, City = "Москва" };

Peoples[4] = new People() { Surname = "Антонов", YearOfBirth = 2001, City = "Новокузнецк" };

Peoples[5] = new People() { Surname = "Попов", YearOfBirth = 1980, City = "Новокузнецк" };

var Result = Peoples.Where(p => p.YearOfBirth > 1980);

// Result = {[Петров, 1999, Москва], [Антонов, 2001, Новокузнецк]}

Пример 2: реализация предыдущего примера с помощью метода.

bool F(People p)

{

return p.YearOfBirth > 1980;

}

var Result = Peoples.Where(F);

//Result = {[Петров, 1999, Москва], [Антонов, 2001, Новокузнецк]}

9.3.2Метод Select

Метод Select(selector) используется для обеспечения вывода элемента последовательности в видоизмененном виде. Для преобразования элемента последовательности используется selector – реализация делегата Func, входным параметром которого является элемент последовательности, а выходным – видоизмененное значение данного элемента.

Пример 1: отобрать фамилии людей, родившихся после 1980 года (реализация с помощью лямбда-выражения).

163

var Result = Peoples.Where(p => p.YearOfBirth > 1980)

.Select(p => p.Surname); // Result = {“Петров”, “Антонов”}

Пример 2: реализация предыдущего примера с помощью метода.

string F(People p)

{

return p.Surname;

}

var Result = Peoples.Where(p => p.YearOfBirth > 1980).Select(F);

//Result = {“Петров”, “Антонов”}

9.3.3Методы сортировки

Метод OrderBy(keySelector) выполняет сортировку по возрастанию, а метод OrderByDescending(keySelector) – по убыванию. Для определения правила сортировки используется keySelector – реализация делегата Func, входным параметром которого является элемент последовательности, а выходным – видоизмененное значение данного элемента, по которому и осуществляется сортировка.

Пример 1: отсортировать людей в алфавитном порядке фамилий (реализация с помощью лямбда-выражения).

People[] Peoples = new People[6];

Peoples[0] = new People() { Surname = "Иванов", YearOfBirth = 1980, City = "Новокузнецк" };

Peoples[1] = new People() { Surname = "Петров", YearOfBirth = 1999, City = "Москва" };

Peoples[2] = new People() { Surname = "Иванов", YearOfBirth = 1971, City = "Псков" };

Peoples[3] = new People() { Surname = "Степанов", YearOfBirth = 1980, City = "Москва" };

Peoples[4] = new People() { Surname = "Антонов", YearOfBirth = 2001, City = "Новокузнецк" };

Peoples[5] = new People() { Surname = "Попов", YearOfBirth = 1980, City = "Новокузнецк" };

var Result = Peoples.OrderBy(p => p.Surname); // Result = {[Антонов, 2001, Новокузнецк],

[Иванов, 1980, Новокузнецк], [Иванов, 1971, Псков], [Петров, 1999, Москва], [Попов, 1980, Новокузнецк], [Степанов, 1980, Москва]}

Пример 2: реализация предыдущего примера с помощью метода.

string F(People p)

{

return p.Surname;

164

1980,
Result_TB

}

var Result = Peoples.OrderBy(F);

// Result = {[Антонов, 2001, Новокузнецк],

[Иванов, 1980, Новокузнецк], [Иванов, 1971, Псков], [Петров, 1999, Москва], [Попов, 1980, Новокузнецк], [Степанов, 1980, Москва]}

Пример 3: отсортировать людей в алфавитном порядке фамилий. При наличии людей с одинаковыми фамилиями, отсортировать их по году рождения.

var Result = Peoples.OrderBy(p => p.Surname)

.OrderBy(p => p.YearOfBirth);

// Result = {[Иванов, 1971, Псков], [Иванов, 1980, Новокузнецк], [Попов, 1980, Новокузнецк], [Степанов, 1980, Москва], [Петров, 1999, Москва], [Антонов, 2001, Новокузнецк]}

Приведенный выше пример не дал требуемого результата. Вместо двухкритериальной сортировки были выполнены две независимые сортировки последовательно. Для выполнения многокритериальной сортировки требуется использовать методы ThenBy(keySelector) (сортировка по возрастанию) или ThenByDescending(keySelector) (сортировка по убыванию) для второго и последующих критериев.

var Result = Peoples.OrderBy(p => p.Surname)

.ThenBy(p => p.YearOfBirth); // Result = {[Антонов, 2001, Новокузнецк],

[Иванов, 1971, Псков], [Иванов, 1980, Новокузнецк], [Петров, 1999, Москва], [Попов, 1980, Новокузнецк], [Степанов, 1980, Москва]}

9.3.4 Метод GroupBy

Метод GroupBy(keySelector) используется для группировки элемента последовательности по некоторому признаку. Для определения метода группировки используется keySelector – реализация делегата Func, входным параметром которого является элемент последовательности, а выходным – значение, по которому осуществляется группировка элементов.

Пример 1: сгруппировать данные о людях по городу их проживания и вывести в алфавитном порядке названий городов. В пределах каждого города выводить людей в алфавитном порядке фамилий. Вывод осуществлять в компонент

класса TextBox (реализация с использованием лямбда-выражения).

People[] Peoples = new People[6];

Peoples[0] = new People() { Surname = "Иванов", YearOfBirth = City = "Новокузнецк" };

Peoples[1] = new People() { Surname = "Петров", YearOfBirth = 1999, City = "Москва" };

165

Peoples[2] = new People() { Surname = "Иванов", YearOfBirth = 1971, City = "Псков" };

Peoples[3] = new People() { Surname = "Степанов", YearOfBirth = 1980, City = "Москва" };

Peoples[4] = new People() { Surname = "Антонов", YearOfBirth = 2001, City = "Новокузнецк" };

Peoples[5] = new People() { Surname = "Попов", YearOfBirth = 1980, City = "Новокузнецк" };

var Result = Peoples.OrderBy(p => p.Surname). GroupBy(p => p.City).OrderBy(p => p.Key);

Result_TB.Clear();

foreach (var group in Result)

{

Result_TB.AppendText(group.Key + "\n");

foreach (var p in group)

 

Result_TB.AppendText("

" + p.Surname + "\n");

}

 

Результат будет выведен в виде:

Москва

Петров

Степанов

Новокузнецк

Антонов

Иванов

Попов

Псков

Иванов

В данном примере сначала осуществляется сортировка в алфавитном порядке фамилий (чтобы в пределах группы была выполнена правильная сортировка), потом группировка по городу проживания, и затем – сортировка по ключу группировки (городу проживания), чтобы группы выводились в заданном порядке.

Пример 2: реализация предыдущего примера с помощью метода.

string F(People p)

{

return p.City;

}

var Result = Peoples.OrderBy(p => p.Surname).GroupBy(F)

.OrderBy(p => p.Key);

166