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的表中多列检索多个关键字