Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базовые технологии платформы .NET.docx
Скачиваний:
15
Добавлен:
02.11.2018
Размер:
626.37 Кб
Скачать

6. Операторы работы с множествами.

В LINQ to Objects имеется набор операторов для работы с множествами.

IEnumerable<T> Distinct<T>(this IEnumerable<T> source);

IEnumerable<T> Union<T>(this IEnumerable<T> first,

IEnumerable<T> second);

IEnumerable<T> Intersect<T>(this IEnumerable<T> first,

IEnumerable<T> second);

IEnumerable<T> Except<T>(this IEnumerable<T> first,

IEnumerable<T> second);

Оператор Distinct() удаляет из коллекции повторяющиеся элементы. Операторы Union(), Intersect() и Except() представляют объединение, пересечение и разность двух множеств.

7. Операторы агрегирования.

К операторам агрегирования относятся операторы, результатом работы которых является скалярное значение. Следующие операторы возвращают количество элементов коллекции. При этом может быть использована перегруженная версия, принимающая в качестве второго параметра предикат фильтрации.

int Count<T>(this IEnumerable<T> source);

long LongCount<T>(this IEnumerable<T> source);

Следующие операторы подсчитывают сумму и среднее значение в коллекции. При этом Num должен быть числовым типом int, long, float, double, decimal. Допускаются типы с поддержкой null (например, long?).

Num Sum(this IEnumerable<Num> source);

Num Sum<T>(this IEnumerable<T> source, Func<T, Num> selector);

Num Average(this IEnumerable<Num> source);

Num Average<T>(this IEnumerable<T> source, Func<T, Num> selector);

Существует также несколько перегруженных версий операторов для нахождения минимального и максимального значений.

Num Min/Max(this IEnumerable<Num> source);

Num Min<T>/Max<T>(this IEnumerable<T> src, Func<T, Num> selector);

T Min<T>/Max<T>(this IEnumerable<T> source);

S Min<T, S>/Max<T, S>(this IEnumerable<T> src, Func<T, S> selector);

Первые две версии применяются для коллекций с числовым элементом. Последние две предполагают, что элемент коллекции реализует интерфейс IComparable<T>.

Оператор Aggregate() позволяет выполнить для коллекции собственный алгоритм агрегирования. Его простейшая форма:

T Aggregate<T>(this IEnumerable<T> source, Func<T, T, T> func);

Функция func принимает два аргумента: значение-аккумулятор и текущее значение коллекции. Результат функции перезаписывается в аккумулятор. В следующем примере оператор Aggregate() применяется для обращения строки:

var text = "The quick brown fox jumps over the lazy dog";

string[] words = text.Split(' ');

var reversed = words.Aggregate((acc, next) => next + " " + acc);

8. Операторы генерирования.

Эта группа операторов позволяет создать набор данных. Первый оператор группы – оператор Range(). Он просто выдаёт указанное количество подряд идущих целых чисел, начиная с заданного значения.

IEnumerable<int> Range(int start, int count);

Продемонстрируем использование Range() в задаче поиска простых чисел:

var primes = Enumerable.Range(2, 999).

Where(x => !Enumerable.Range(2, (int) Math.Sqrt(x)).

Any(y => x != y && x%y == 0));

foreach (var prime in primes)

{

Console.WriteLine(prime);

}

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

IEnumerable<T> Repeat<T>(T element, int count);

Покажем не совсем стандартное применение Repeat() для генерирования последовательности случайных чисел:

Random rnd = new Random();

var r1 = Enumerable.Repeat(0, 20).Select(i => rnd.Next(0, 40));

Последним генерирующим оператором является оператор Empty(), который порождает пустое перечисление определенного типа.

IEnumerable<T> Empty<T>();