どのようにLINQのはIOrderedEnumerableメソッドの後のIEnumerableメソッドを使用していますか?

StackOverflow https://stackoverflow.com/questions/1559113

質問

は、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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top