繁体   English   中英

避免使用linq多次浏览列表,具有动态条件(过滤器)

[英]Avoid to browse a list multiple time with linq, with dynamic conditions (filter)

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

谢谢

作为Juharr在评论中提到,LINQ的不会评价你的.Where调用它之后。 只有在调用ToList/ToArray/First/Single/foreach时,它才会评估该子句,它会自动组合您的过滤器。

你可以做一个巨大的地方查询将所有条件移动到一个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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM