シナリオ :リストと3つの検索フィルターがあります。何かのようなもの:
ResultList = OriginalList.Where(filter1).Where(filter2).Where(filter3);
質問 :LINQでfilter1とfilter2を実行せずに、フィルター3を更新してからResultListを更新できますか? (パフォーマンスを向上させたい)
基本的には、以下と同じです。
Result1 = OriginalList.Where(filter1).Where(filter2);
Result2 = Result1.Where(filter3);
UpdateFilter3(); // Just changes the filter somehow
Result2 = Result1.Where(filter3);
return Result2;
これは追跡するのが少し面倒で、これを行うためのよりスマートな方法があるかどうか疑問に思っていましたか?私は継続的なLINQ(CLINQ: http ://clinq.codeplex.com/)を調べましたが、基本的には、LINQに対して、いずれかのフィルターが変更されるたびにWHEREステートメント全体を更新するように指示しているようです。
知恵の言葉は大歓迎です:)
おかげで、
マイケル
(仮定: OriginalList
ではなく、 OriginalQuery
という変数名を使用したので、ここではLINQ-To-ObjectとIEnumerableについて説明していると想定しています。)
はい 、IEnumerableではなくResult1をリストにすることで可能です 。このような:
Result1 = OriginalList.Where(filter1).Where(filter2).ToList();
Result2 = Result1.Where(filter3);
UpdateFilter3(); // Just changes the filter somehow
Result2 = Result1.Where(filter3);
return Result2;
リストとして、 Result1
は単にIEnumerableが待機するだけではなく、 Result1
filter1
とfilter2
永続的に適用される、実際の堅実なリストです。 4行目が上記のように実行されると、1行目で作成した固体リストから外れます。フィルター3を交換してResult1に100回再適用すると、 filter1
とfilter2
は1回だけ適用されます。
リストの作成にはコストがかかりますが、複数のfilter3
フィルターを再適用する場合、特にfilter1
とfilter2
が複雑であるか、セットを大幅に削減する場合は、 filter1
でfilter2
です。