C# linq:在同一属性字段的列表中检查多个条件

Posted

技术标签:

【中文标题】C# linq:在同一属性字段的列表中检查多个条件【英文标题】:C# linq: Check multiple conditions on a list on the same property field 【发布时间】:2021-10-20 01:27:52 【问题描述】:

当 'name' 与 'AAA' 和 'BBB' 匹配时,我正在尝试获取 'testNumber',如下所示,但 '_check' bool 字段为 false'。我错过了什么?

 static void Main(string[] args)
    
        var _tests = new List<testDetails>()
        
            new testDetails  testNumber = "1111111", name =  "AAA"  ,
            new testDetails  testNumber = "1111111",  name =  "BBB"   ,
            new testDetails  testNumber = "1111111",  name =  "CCC"   ,
            new testDetails  testNumber = "1111111",  name =  "DDD"   ,
            new testDetails  testNumber = "222222", name =  "AAA"  ,
            new testDetails  testNumber = "22222",  name =  "BBB"   ,
            new testDetails  testNumber = "33333",  name =  "CCC"   ,
            new testDetails  testNumber = "11111",  name =  "EEE"   ,
            new testDetails  testNumber = "33333",  name =  "CCC"   ,
            new testDetails  testNumber = "55555",  name =  "DDD"   
        ;
    
        foreach (var _test in _tests.GroupBy(x => x.testNumber).ToList())
        
            bool _check = _test.Where(o => o.name.Equals("AAA") && o.name.Equals("BBB")).Any();
           //_test.Any(p => p.name.Equals("AAA") && p.name.Equals("BBB")) - false
            //why is _check false?
            if (_check)
            
                string _string = string.Empty;
                _string = _test.Where(o => o.name.Equals("AAA") && o.name.Equals("BBB")).Select(q => q.testNumber).FirstOrDefault();
            
        
    

【问题讨论】:

【参考方案1】:

您当前正在检查同一个对象是否同时具有名称"AAA"名称"BBB"

嗯,同一个对象不能同时拥有两者。因此,您应该改用 OR 语句。

bool _check = _test.Where(o => o.name.Equals("AAA") || o.name.Equals("BBB")).Any();

【讨论】:

这在逻辑上如何正确?我必须检查列表中的号码是否同时存在 AAA 和 BBB。考虑到上述情况,AAA & ZZZ 也可以为真。 @Deson 你有单独的不同对象,每个对象都是使用“new”创建的,所以 new testDetails testNumber = "1111111", name = "AAA" 与 new testDetails testNumber = "1111111", name = "BBB" ,但单独一个。【参考方案2】:

也许您正在寻找的是:

bool _check = _test.Any(o => o.name.Equals("AAA")) && _test.Any(o => o.name.Equals("BBB"));

这将检查您的组是否包含至少一个带有“AAA”的 testDetails 和一个带有“BBB”的 testDetails

您当前的代码无法工作,因为testDetails 的一个实例不能同时拥有他的名字“AAA”和“BBB”

【讨论】:

我想我必须坚持具备上述两个条件。我误解了我的 && 条件。谢谢!【参考方案3】:
o.name.Equals("AAA") && o.name.Equals("BBB")

这段代码总是假的,也许你想要的就是这段代码。

o.name.Equals("AAA") || o.name.Equals("BBB")

【讨论】:

【参考方案4】:
bool _check = _test.Where(o => o.name.Equals("AAA") && o.name.Equals("BBB")).Any();

o.name 不能同时等于“AAA”和“BBB”。应该是 or 操作吗?

【讨论】:

【参考方案5】:

看起来就像您在 AND 和 OR 之间混淆一样简单 - 您所做的查询是获取名称为“AAA”且名称为“BBB”的所有值;但如果名称为“AAA”,则名称不能为“BBB”。

如果你把 && 换成 ||那么您将获得名称为“AAA”或“BBB”的值

【讨论】:

以上是关于C# linq:在同一属性字段的列表中检查多个条件的主要内容,如果未能解决你的问题,请参考以下文章

c# 用来自多个 Linq 查询的数据填充 listView

C#中如何用Linq在SQL Server的表中多列检索多个关键字

C#LINQ Group通过自定义属性的多个字段

检查 XML 节点是不是具有 Linq C# 的属性?

在 C# linq 中结合多个具有可选参数的 where 条件?

LINQ 在 C# 中加入多个条件