10

私はこのコードを見ています

var numbers = Enumerable.Range(0, 20);
var parallelResult = numbers.AsParallel().AsOrdered()
    .Where(i => i % 2 == 0).AsSequential();

foreach (int i in parallelResult.Take(5))
    Console.WriteLine(i);

結果のAsSequential()配列をソートすることになっています。実際には実行後にソートされますが、 への呼び出しを削除してもAsSequential()、( が呼び出されたため) ソートされたままAsOrdered()です。

2つの違いは何ですか?

4

2 に答える 2

12

AsSequentialそれ以上の並列実行を停止することを目的としているため、名前が付けられました。「結果の配列をソートすることになっている」という考えをどこで得たのかわかりません。ドキュメントは非常に明確です:

ParallelQuery を IEnumerable に変換して、クエリの順次評価を強制します。

あなたが言うように、AsOrdered順序付けを保証します(その特定のシーケンスに対して)。

于 2013-10-09T07:30:31.293 に答える
2

これが 1 年以上前に尋ねられたことは知っていますが、これが私の 2 セントです。

公開されている例では、次のクエリ演算子 (この場合は Take 演算子) が順次実行されるように AsSequential を使用していると思います。

ただし、Take 演算子は、ソース要素が元のインデックス位置にない限り、クエリが並列化されるのを防ぎます。そのため、AsSequential 演算子を削除しても、結果はソートされたままになります。

于 2015-03-07T20:13:59.030 に答える