2016-05-30 1 views
0

にLINQでのIQueryable 内のすべてのアイテムを前処理以下のコードを見てください。次の述語。したがって、 listに何千ものオブジェクトが含まれている場合は、 Preprocessはすべて処理するのではなく、 Where節で選択されたオブジェクトだけを処理します。 は、オブジェクト

Preprocessをクエリの最後に移動する方が良いと思われるのはわかりますが、私はそのようにする理由があります。

IQueryable<T>で可能ですか?または、IEnumerableのように動作しますか?LINQからオブジェクトへのパイプライン全体が厳密に連続していますか?

+0

このようなLINQアイテムは、次に来るものが分からないので、あなたが求めているものは不可能だと最初は言います。それを書く別の方法は次のようになります: 'var preprocessed = list.Preprocess(); var whereResult = preprocessed.Where(); var selection = whereResult.ToList(); 'このようにリストされると、どのステートメントも次のステートメントについての知識を持っていないことがわかります。 – GTHvidsten

+0

前処理メソッドにセレクタ述語を取ってもらえますか?前処理(x => x.MyProperty == 42)? – sondergard

+1

興味のないところでは、Whereの後に前処理を置くだけの理由はありますか? – Evk

答えて

1

ここではIQueryableIEnumerableと変わりません。純粋に逐次的です。 Where()を呼び出した直後には、元の "コレクション"のトレースは事実上ありません。

は理論的にはあなたが望むことを行うことができますが、それは "独自のLINQ"をローリングする必要があります。 Preprocess()は何らかの種類のPreprocessedEnumerableを返すことができ、すべてのカスタム演算子がそれにアタッチし、最後のToList()が呼び出しの並べ替えを行います。

関連する問題