避免使用linq和动态条件(筛选器)多次浏览列表

本文关键字:筛选 列表 浏览 条件 linq 动态 | 更新日期: 2023-09-27 17:57:26

我有一个包含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.

感谢

避免使用linq和动态条件(筛选器)多次浏览列表

正如Juharr在评论中提到的那样,Linq不会在调用.Where之后立即对其进行求值。只有当调用ToList/ToArray/First/Single/foreach时,它才会对子句进行求值,并自动组合您的筛选器。

您可以执行一个巨大的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));

但我真的怀疑它是否会提高您的枚举性能。

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