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はIOrderedEnumerable<T>、Where()にパイプされたものを返します。Whereは。でしか機能しないため、最初の方法は機能しないはずIEnumerable<T>です。悲しいかな...それは動作します。

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

4

1 に答える 1

8

違いは、varキーワードとLINQクエリの誤解によるものです。

var(C#リファレンス)

キーワードを使用するvarことは、割り当ての右側と同じタイプを指定することと同じです。変数に任意の型を割り当てることができるという意味ではありません。

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

この場合、これと同等のことを行っています。

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);

最初のスニペットが機能する理由は、からIOrderedEnumerable継承するIEnumerableため、そのまま使用できます。

query2番目の例の問題を修正するには、明示的にとして宣言する必要がありますIEnumerable<Process>

于 2012-04-09T21:49:32.980 に答える