Операции создания ParallelQuery

65

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 последовательность перечисляется с выводом всех ее элементов на консоль. Запуск кода из листинга дает следующие результаты:

Использование метода Repeat
Пройди тесты
Лучший чат для C# программистов