2017-06-07 34 views
2

我想知道在C#中AsParallel和AsParallel.Select()之間的區別是什麼,因爲兩者都返回AsParallelQuery的實例。 考慮下面的代碼片段:AsParallel和AsParallel.Select在C#中的差異

var list = Enumerable.Range(1, 100).ToList(); 

      var parallelList = list.AsParallel(); 
      foreach (var num in parallelList) 
       System.Console.WriteLine(num);//returns 1 ..100 in order 

      var query = list.AsParallel().Select(num => num); 

      foreach (var num in query) 
       System.Console.WriteLine(num);/*returns 1..100 not in order*/ 

      parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order 

我不知道,list.AsParallel()和list.AsParallel()選擇()如何解釋不同

+1

''Select''將列表中的元素轉換爲另一種形式。在您的代碼示例中,select只是輸出與接收輸入相同的元素,因此與「'Select.'沒有''list.AsParallel()''沒有任何區別。 –

+0

但是,按照我的理解,'AsParallel()'應該如何對'ParallelQuery '進行迭代,並行觸發查詢(數據並行),並且結果也應該按順序收集。 –

+3

您可以進行迭代'foreach'語句並不知道並行化,它只是在** 1 **線程中迭代集合 – VMAtm

回答

3

什麼AsParallel()做的是,它是指任何以下LINQ方法會。並行執行。它的作用不是直接影響的是foreach如何表現。

所以,這樣的:

var parallelList = list.AsParallel(); 

foreach (var num in parallelList) 
    System.Console.WriteLine(num);//returns 1 ..100 in order 

只是迭代list一個令人困惑的方式。它不會並行任何東西。

雖然此:

var query = list.AsParallel().Select(num => num); 

foreach (var num in query) 
    System.Console.WriteLine(num);/*returns 1..100 not in order*/ 

並行執行的(無用)Select查詢,它可能會改變元素的順序。但foreach仍然在單個線程上執行。

最後,這樣的:

parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order 

不能編譯,除非你有一些自定義ForEach擴展方法,可能表現一樣foreach。 (有ForAll,但這是不同的。)