1

シナリオ: リストと 3 つの検索フィルターがあります。何かのようなもの:

ResultList = OriginalList.Where(filter1).Where(filter2).Where(filter3);


質問: フィルター 3 を更新してから、LINQ でフィルター 1 とフィルター 2 を実行せずに ResultList を更新することはできますか? (パフォーマンスを上げたい)

基本的には、次のようになります。

Result1 = OriginalList.Where(filter1).Where(filter2);
Result2 = Result1.Where(filter3);
UpdateFilter3(); // Just changes the filter somehow
Result2 = Result1.Where(filter3);
return Result2;

これは追跡するのが少し面倒ですが、これを行うためのよりスマートな方法があるかどうか疑問に思っていましたか? Continuous LINQ (CLINQ: http://clinq.codeplex.com/ ) を見ましたが、基本的には、フィルターの 1 つだけが変更されるたびに WHERE ステートメント全体を更新するように LINQ に指示しているようです。

知恵の言葉は大歓迎です:)

ありがとう、
マイケル

4

1 に答える 1

1

(仮定:変数名を使用したのOriginalListではなく、OriginalQueryまたはそのようなものを使用したため、ここでは単純な LINQ-To-Object と IEnumerable について話していると思います。)

はい、できます。Result1 を IEnumerable ではなく List にすることで可能です。このような:

Result1 = OriginalList.Where(filter1).Where(filter2).ToList();
Result2 = Result1.Where(filter3);
UpdateFilter3(); // Just changes the filter somehow
Result2 = Result1.Where(filter3);
return Result2;

リストとしては、IEnumerable が待機しているだけではなく、いわば永続的に適用されたResult1、実際の堅実なリストです。上記の行 4 を実行すると、行 1 で作成したソリッド リストからはまだ外れています。フィルター 3 を交換して Result1 に 100 回再適用できますが、適用されるのは 1 回だけです。filter1filter2filter1filter2

リストの作成にはコストがかかりますが、複数のfilter3フィルターを再適用する場合、特にfilter1filter2が複雑であるかセットが大幅に削減されている場合は、それを補う以上の費用がかかります。

于 2010-08-02T16:47:11.153 に答える