避免使用linq和动态条件(筛选器)多次浏览列表
本文关键字:筛选 列表 浏览 条件 linq 动态 | 更新日期: 2023-09-27 17:57:26
我有一个包含Article
对象的列表。此对象的参数为
类别、描述、状态、类别
用户可以使用他想要的组合来过滤列表。仅描述,或类别+类别,依此类推。
因此,如果用户选择一个条件,我将得到一个int>=0,否则我将得到-1。
例如,如果他选择用Status
和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.
感谢
正如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));