3

我有一个包含Article 对象的列表。该对象的参数是

类别、描述、状态、类别

用户可以使用他想要的组合过滤列表。只有描述,或类别 + 类,依此类推。

所以如果用户选择一个标准,我会得到一个 int >= 0,否则我会得到-1。

例如,如果他选择使用Statusand过滤Category,我会得到

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

Where您可以通过注意以下事项来执行 HUGE 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 回答