どのようにLINQのはIOrderedEnumerableメソッドの後のIEnumerableメソッドを使用していますか?
-
21-09-2019 - |
質問
は、LINQのでは、Where
のような拡張メソッドがIEnumerable
コレクションを返しますが、OrderBy
のようなソート方法がIOrderedEnumerable
コレクションを返します。
OrderBy
を返す)IOrderedEnumerable
で終わるクエリを持っている場合は、だから、あなたは後でWhere
メソッドを追加することはできません - コンパイラはWhere
に渡されるタイプ文句
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
query = query.Where(p => p.ProcessName.Length < 5);
あなたは1つのクエリでそれをすべて行う場合は、しかし、それは素晴らしいです!
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id)
.Where(p => p.ProcessName.Length < 5);
私は、コンパイラは操作のいずれかを再発注されたかどうかを確認するためにリフレクターにアセンブリを見てきましたが、持っていないようです。このしくみを教えてください。
解決
あなたはまだ拡張メソッドのいずれかを使用することができますので、
IOrderedEnumerable<T>
はIEnumerable<T>
を拡張します。あなたが効果的に書かれていたため、コードのあなたの最初のブロックが機能しなかった理由があります:
IOrderedEnumerable<Process> query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
// Fail: can't assign an IEnumerable<Process> into a variable
// of type IOrderedEnumerable<Process>
query = query.Where(p => p.ProcessName.Length < 5);
query.Where(...)
のみIEnumerable<Process>
変数に割り当てることができないquery
を返すので、それが失敗しました。問題だWhere
を呼び出していない - それは元の変数に結果を代入です。それを証明するために、このコードはうまく動作します。
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
// Introduce a new variable instead of trying to reuse the previous one
var query2 = query.Where(p => p.ProcessName.Length < 5);
また、あなたが開始するIEnumerable<T>
されるクエリを宣言することができます:
IEnumerable<Process> query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
// Fine
query = query.Where(p => p.ProcessName.Length < 5);
所属していません StackOverflow