3

オブジェクトのリストがありArticle ます。このオブジェクトのパラメータは

カテゴリ、説明、ステータス、クラス

ユーザーは、必要な組み合わせでリストをフィルタリングできます。説明のみ、またはカテゴリ + クラスなど。

したがって、ユーザーが基準を選択すると、int >= 0 を取得し、それ以外の場合は -1 を取得します。

たとえば、彼が と でフィルタリングすることを選択した場合StatusCategory私は取得します

FilterCategory = x、FilterDescription = -1、FilterStatus = y、FilterClass = -1

リストをフィルタリングする私の方法は次のとおりです。

if (FilterCategory != -1)
    list = list.Where(a => a.Category == FilterCategory);
if (FilterDescription != -1)
    list = list.Where(a => a.Description == FilterDescription);
if (FilterStatus != -1)
    list = list.Where(a => a.Status == FilterStatus);
if (FilterClass != -1)
    list = list.Where(a => a.Class == FilterClass);

このように、リストを 4 回反復する必要があります。多くのアイテムでは効率的ではありません。リストを一度参照し、一意の場所で 4 つの条件を確認します。しかし、特定の条件 != -1 でそれを行う方法がわかりません。

ありがとうございました

4

3 に答える 3

4

Juharrがコメントで言及しているように、Linqは.Whereそれを呼び出した後にあなたの権利を評価しません。呼び出すときにのみToList/ToArray/First/Single/foreach、句が評価され、フィルターが自動的に結合されます。

于 2013-02-03T13:34:49.013 に答える
2

次のことに注意して、すべての条件を 1 つに移動する巨大な Where クエリを実行できますWhere

if (FilterCategory != -1)
    list = list.Where(a => a.Category == FilterCategory);

次と同等です。

list = list.Where(a => FilterCategory == -1 || a.Category == FilterCategory);

次に、クエリは次のとおりです。

list = list.Where(a => (FilterCategory == -1 || a.Category == FilterCategory)
                    && (FilterDescription == -1 || a.Description == FilterDescription)
                    && (FilterStatus == -1 || a.Status == FilterStatus)
                    && (FilterClass == -1 || a.Class == FilterClass));

しかし、それが列挙のパフォーマンスを向上させるとは思えません。

于 2013-02-03T13:20:12.177 に答える
1
list = list.Where(a => (FilterCategory != -1 || a.Category == FilterCategory) && 
                                       (FilterDescription != -1 || a.Description == FilterDescription) &&
                                       (FilterStatus != -1 || a.Status == FilterStatus) &&
                                       (FilterClass != -1 || a.Class == FilterClass));
于 2013-02-03T13:21:36.820 に答える