gpt4 book ai didi

c# - Linq - 检查所有但仅当至少有一个时

转载 作者:行者123 更新时间:2023-11-30 16:00:55 24 4
gpt4 key购买 nike

我正在 Linq 中编写一个查询,它需要检查列表中的一个或多个项是否通过谓词A(),并且没有 strong> 传递谓词 B()。它需要是单个查询才能启用 Linq to SQL。因此,对于以下列表,结果应如下所示,其中 a 传递谓词 A()b 传递谓词 B():

1. [ a, a ] => true
2. [ a ] => true
3. [ a, b ] => false
4. [ b, b ] => false
5. [ b ] => false
6. [ ] => false

我尝试了以下方法,但每种方法都会在某些情况下失败:

// Fails in case 6
MyList.All(x => A(x) && !B(x));

// Fails in case 3
MyList.Where(x => !B(x)).Count(x => A(x)) > 0;

// This works, but it's not a single query anymore
MyList.All(x => A(x) && !B(x)) && Mylist.Count() > 0;

我觉得我在这里需要的是与 all 等价的东西,但对于空列表返回 false。例如,这将在所有情况下通过:

MyList.AllButReturnFalseIfListIsEmpty(x => A(x) && !B(x));

我怎样才能做到这一点?

最佳答案

你可以这样做:

var result = MyList
.Select(x => B(x) ? -1 : (A(x) ? 1 : 0))
.Aggregate(0, (p, v) => v == -1 || p == -1 ? -1 : p + v) > 0;

查询工作如下:

    Btrue 时,
  • Select 生成 -1;否则,如果 Atrue,则生成 1;如果 A 为 false,则生成 0
  • Aggregate-1, 0, 1 检查这个数字列表。如果它看到 -1,则聚合结果为 -1。否则,聚合结果为正值之和。
  • 最后的比较确保至少有一个 A 而没有 B

关于c# - Linq - 检查所有但仅当至少有一个时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39344841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com