首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于不同布尔条件C#的Linq where子句

基于不同布尔条件C#的Linq where子句
EN

Stack Overflow用户
提问于 2022-09-14 10:59:11
回答 4查看 82关注 0票数 0

嗨,我试图过滤一个基于多个bool参数的项目列表。我有3个bool参数(它们是UI中的3个复选框):IsTypeAIsTypeBIsTypeC。基于这3个值,我必须在条目的枚举属性(简单称为"Type")上筛选我的列表。可以选中多个复选框。在类型过滤器之上还有另一个过滤器("in","out"),但这是有效的。到目前为止,我尝试的是:

代码语言:javascript
运行
复制
FilteredDashboardItems = AllItems?.Where(x => 
                    Destination == "in" ?
                    (
                        (IsTypeA == true ? x.Type == Helpers.Enum.A : true)                    
                        &&
                        (IsTypeB == true ? x.Type == Helpers.Enum.B : true)                    
                        &&
                        (IsTypeC == true ? x.Type == Helpers.Enum.C : true)                    
                    ) : 
                    Destination == "out" ?
                    (
                        (IsTypeA == true ? x.Type == Helpers.Enum.A : true)                    
                        &&
                        (IsTypeB == true ? x.Type == Helpers.Enum.B : true)                    
                        &&
                        (IsTypeC == true ? x.Type == Helpers.Enum.C : true)                    
                    ) : true)?.ToList();

问题是:如果我奇异地选中一个复选框(假设是IsTypeA),该列表将被正确筛选为A类型项。但是,如果我选中另一个复选框(假设是IsTypeB),而不是向我显示A+B类型筛选列表,列表将返回0项。我该怎么解决呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-09-14 11:38:29

你需要这样的东西:

代码语言:javascript
运行
复制
    List<int> typesToCheck = new List<int>();

    if (IsTypeA) typesToCheck.Add((int)Helpers.A);
    if (IsTypeB) typesToCheck.Add((int)Helpers.B);
    if (IsTypeC) typesToCheck.Add((int)Helpers.C);

    FilteredDashboardItems = AllItems?.Where(x => Destination == "in" ?
        (IsTypeA || IsTypeB || IsTypeC ? typesToCheck.Contains(x.Type) : true)
        :
        Destination == "out" ?
            (IsTypeA || IsTypeB || IsTypeC ? typesToCheck.Contains(x.Type) : true)
            : 
            true)?.ToList();

一旦你把它写进这个表格,我相信你也可以简化目标条件

票数 0
EN

Stack Overflow用户

发布于 2022-09-14 11:12:06

您正在使用&&,这将给您两个过滤器的交集,从而获得0条记录。

您需要使用OR \x\\以便它显示满足任何一个筛选器的元素。

票数 1
EN

Stack Overflow用户

发布于 2022-09-14 11:25:30

你的情况有点奇怪

代码语言:javascript
运行
复制
IsTypeA == true ? x.Type == Helpers.Enum.A : true

如果IsTypeA不是可空bool,那么就不需要将其与true进行比较,因为从逻辑上来说,您可以得到true == truefalse == trueE 210,所以您可以只留下E 111IsTypeAE 212

我会重写你的条件:

代码语言:javascript
运行
复制
FilteredDashboardItems = AllItems?.Where(x => 
                    Destination == "in" ?
                    (
                        (IsTypeA && x.Type == Helpers.Enum.A)                    
                        ||
                        (IsTypeB && x.Type == Helpers.Enum.B)                    
                        ||
                        (IsTypeC && x.Type == Helpers.Enum.C)                    
                    ) : 
                    Destination == "out" ?
                    (
                        (IsTypeA && x.Type == Helpers.Enum.A)                    
                        ||
                        (IsTypeB && x.Type == Helpers.Enum.B)                    
                        ||
                        (IsTypeC && x.Type == Helpers.Enum.C)                    
                    ) : true)?.ToList();

现在我们有了简单的逻辑:如果所选类型中至少on等于对象类型,则保留此对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73715715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档