Операции создания ParallelQuery
65LINQ --- PLINQ --- Операции создания ParallelQuery
AsParallel
Метод AsParallel — своего рода "входная дверь" в PLINQ. Он преобразует последовательность данных в ParallelQuery. Механизм LINQ обнаруживает использование ParallelQuery в качестве источника в запросе и переключается на выполнение PLINQ автоматически. Метод AsParallel, скорее всего, будет применяться при каждом использовании PLINQ.
Метод AsParallel имеет два прототипа, которые описаны ниже:
- Первый прототип AsParallel
-
public static ParallelQuery<T> AsParallel<T> ( this IEnumerable<T> source)
Этот прототип работает на IEnumerable<T> и возвращает экземпляр ParallelQuery<T>, который может быть использован в качестве основы запроса PLINQ.
- Второй прототип AsParallel
-
public static ParallelQuery<T> AsParallel ( this IEnumerable source)
Второй прототип создает экземпляр ParallelQuery из IEnumerable и предназначен для поддержки унаследованных коллекций, таких как System.Collections.ArrayList. Объект ParallelQuery не является строго типизированным и не может использоваться в качестве основы запроса PLINQ без преобразования в ParallelQuery<T>. Приведение ParallelQuery к ParallelQuery<T> осуществляется с помощью операции Cast<T> или путем фильтрации последовательности для получения элементов — экземпляров типа T с применением операции OfType<Т>.
Операция AsParallel достаточно тривиальна, и в предыдущих статьях мы неоднократно ее использовали.
Range
Метод Range создает объект ParallelQuery<int>, содержащий возрастающую последовательность целых чисел. Это статический метод класса ParallelEnumerable, а не расширяющий метод. У метода Range единственный прототип:
public static ParallelQuery<int> Range(
int start, int count)
Методу Range передаются два аргумента. Первый — это целочисленное значение, с которого должна начинаться последовательность, а второй — количество элементов, которые должны быть в последовательности. Метод Range возвращает объект ParallelQuery<int>, содержащий возрастающие значения.
Ниже демонстрируется использование параллельного диапазона. Здесь вызывается статический метод Range для создания ParallelQuery<int>, содержащего 10 целых чисел, начиная со значения 0. Затем в цикле foreach перебираются все элементы последовательности с выводом их на консоль. Та же последовательность используется в качестве основы для запроса PLINQ, где выбираются и выводятся на консоль четные целочисленные значения:
ParallelQuery<int> pq = ParallelEnumerable.Range(0, 10);
foreach (int i in pq) {
Console.WriteLine("Значение {0}", i);
}
IEnumerable<int> results = from i in pq
.AsOrdered()
where i % 2 == 0
select i;
foreach (int i in results) {
Console.WriteLine("Совпадение: {0}", i);
}
Запуск этого примера дает следующие результаты:

Repeat
Repeat, как и Range — статический метод класса ParallelEnumerable, а не операция расширяющего метода. Метод Repeat создает объект ParallelQuery<T>, содержащий одиночное значение типа Т, которое повторяется заданное количество раз.
Метод Repeat имеет один прототип:
public static ParallelQuery<T> Repeat<T>(
T element,
int count)
Метод Repeat принимает два аргумента. Первый — это элемент, который должен повторяться. Второй — количество его повторений в последовательности. Метод Repeat возвращает ParallelQuery<T>, где T — тип элемента, переданного в первом аргументе.
Ниже показано создание повторяющейся последовательности с использованием метода Repeat:
ParallelQuery<int> pq = ParallelEnumerable.Repeat(2, 5);
foreach (int i in pq) {
Console.WriteLine("Значение {0}", i);
}
Здесь создается последовательность, в которой целое значение 2 повторяется 5 раз. В цикле foreach последовательность перечисляется с выводом всех ее элементов на консоль. Запуск кода из листинга дает следующие результаты:
