布尔类型的 FindAll lambda 表达式

FindAll lambda expression on boolean types

提问人:Francky 提问时间:11/3/2023 最后编辑:Peter CsalaFrancky 更新时间:11/3/2023 访问量:51

问:

我有一个有趣的问题。 考虑这一行代码:

List<bool> selectedValues = allValues.FindAll(x => x); 

其中是 s 的列表。 为什么它会找到列表中的所有值,而不是所有值?allValuesbooleanFindAll()trueselectedValuesfalse

据我所知,我们正在评估 () 中的相同值。因此,如果您评估和(或去),那不应该也是如此吗?x => xFalseFalseFalseFalsetrue

为什么如果 x = true, (x=>x) == true, 但如果 x = false,则 (x=>x) == false。

我的理解是:

  1. false 等于 false(使它成为真)
  2. true 等于 true(这也使它成为 true) 为什么 1) 不是真的

我重写了与以下相同的语法:

List<bool> selectedHobbies = allHobbies.FindAll(hobby => x.Equals(true)); 

第二个对我来说更理解。但是我无法掌握第一种语法。 因为第二种语法实际上与另一个值进行检查x

C# 列出 lambda 查找所有

评论


答:

0赞 shree.pat18 11/3/2023 #1

在 中,你本质上是在计算表达式 ,就像你对 所做的那样。因此,它只会选择此表达式的计算结果为 true 的值,即集合中的所有 true 值。x => xxx.Equals(true)

2赞 jmcilhinney 11/3/2023 #2

你不明白lambda表达式是如何工作的,所以你应该对此做一些研究。

(x => x)不是比较。不是比较运算符。第一种是简单地声明一个变量来引用列表中的当前项,就像在循环中所做的那样。与 相比的 lambda 如下所示:xx=>xforeachxx

(x => x == x)

在这种情况下,您将获得列表中的每个项目,因为每个项目都等于自身。该 lambda 正在计算右侧的布尔表达式,并根据结果进行过滤。该表达式计算结果为的项目将被包括在内,其他项目将被排除。该 lambda 等价于:=>true

(x => x == true)

如果 是,则表达式(只是)是,并且将包含该项目。如果是,则表达式是,该项目将被排除。简而言之,这:xtruextruexfalsefalse

allValues.FindAll(x => x)

是说“查找 item 表达式为 的所有项目”。allValuesxxtrue

0赞 Peter Csala 11/3/2023 #3

FindAll充当过滤器。它只保留所提供的元素被计算为 true。由于您的源集合包含布尔值,因此足以充当 (返回 a 的函数)。Predicatex => xPredicateboolean

如果您想过滤 false 值,则可以使用。x => !x