2012-04-09 13 views
0

それが正常に動作します処理パイプラインを理解

 var query = Process.GetProcesses() 
          .OrderBy(p => p.WorkingSet64) 
          .ThenByDescending(p => p.Threads.Count); 
          .Where(p => p.ProcessName.Length < 9); 

してください。テイク

 var query = Process.GetProcesses() 
          .OrderBy(p => p.WorkingSet64) 
          .ThenByDescending(p => p.Threads.Count); 
          //.Where(p => p.ProcessName.Length < 9); 

     query = query.Where(p => p.ProcessName.Length < 9); 

これは機能しません。なぜ最初の方法が働くのか分かりません。私の考えでは、これらのクエリは同じです。 ThenByDescendingは、Where()にパイプされたIOrderedEnumerable<T>を返します。 WhereはIEnumerable<T>としか動作しないため、最初のメソッドは機能しません。悲しいかな...それは働きます。

この処理パイプラインはどのように機能しますか?

+1

配列は 'IEnumerable'と' GetProcesses'がプロセスの配列を返すhttp://msdn.microsoft.com/en-us/library/system.array.aspx –

答えて

8

違いは、varキーワードとLINQクエリの誤解のためです。 varキーワードを使用

var (C# reference)

は、割り当ての右側と同じタイプを指定するのと同じです。変数に型を割り当てることはできません。

LINQクエリでは、ほとんどの基本式はIEnumerableを返しますが、多くの場合、それらは単にIEnumerableを返しません。代わりに、IEnumerableから継承する型を返します。この場合

は、あなたはこの同等のものをやっている: IEnumerableから IOrderedEnumerable継承は、あなたがそれを使用できるようにするので

IEnumerable<Process> query = Process.GetProcesses() 
          .OrderBy(p => p.WorkingSet64) 
          .ThenByDescending(p => p.Threads.Count); 
          .Where(p => p.ProcessName.Length < 9); 

と最初のスニペットが動作することを

IOrderedEnumerable<Process> query = Process.GetProcesses() 
            .OrderBy(p => p.WorkingSet64) 
            .ThenByDescending(p => p.Threads.Count); 

// Won't work because Where doesn't return an IOrderedEnumerable. 
query = query.Where(p => p.ProcessName.Length < 9); 

理由がありますなど。

2番目の例で問題を解決するには、queryIEnumerable<Process>と明示的に宣言する必要があります。

関連する問題