提问人:Francky 提问时间:11/3/2023 最后编辑:Peter CsalaFrancky 更新时间:11/3/2023 访问量:51
布尔类型的 FindAll lambda 表达式
FindAll lambda expression on boolean types
问:
我有一个有趣的问题。 考虑这一行代码:
List<bool> selectedValues = allValues.FindAll(x => x);
其中是 s 的列表。
为什么它会找到列表中的所有值,而不是所有值?allValues
boolean
FindAll()
true
selectedValues
false
据我所知,我们正在评估 () 中的相同值。因此,如果您评估和(或去),那不应该也是如此吗?x => x
False
False
False
False
true
为什么如果 x = true, (x=>x) == true, 但如果 x = false,则 (x=>x) == false。
我的理解是:
- false 等于 false(使它成为真)
- true 等于 true(这也使它成为 true) 为什么 1) 不是真的
我重写了与以下相同的语法:
List<bool> selectedHobbies = allHobbies.FindAll(hobby => x.Equals(true));
第二个对我来说更理解。但是我无法掌握第一种语法。
因为第二种语法实际上与另一个值进行检查x
答:
在 中,你本质上是在计算表达式 ,就像你对 所做的那样。因此,它只会选择此表达式的计算结果为 true 的值,即集合中的所有 true 值。x => x
x
x.Equals(true)
你不明白lambda表达式是如何工作的,所以你应该对此做一些研究。
(x => x)
不是比较。不是比较运算符。第一种是简单地声明一个变量来引用列表中的当前项,就像在循环中所做的那样。与 相比的 lambda 如下所示:x
x
=>
x
foreach
x
x
(x => x == x)
在这种情况下,您将获得列表中的每个项目,因为每个项目都等于自身。该 lambda 正在计算右侧的布尔表达式,并根据结果进行过滤。该表达式计算结果为的项目将被包括在内,其他项目将被排除。该 lambda 等价于:=>
true
(x => x == true)
如果 是,则表达式(只是)是,并且将包含该项目。如果是,则表达式是,该项目将被排除。简而言之,这:x
true
x
true
x
false
false
allValues.FindAll(x => x)
是说“查找 item 表达式为 的所有项目”。allValues
x
x
true
FindAll
充当过滤器。它只保留所提供的元素被计算为 true。由于您的源集合包含布尔值,因此足以充当 (返回 a 的函数)。Predicate
x => x
Predicate
boolean
如果您想过滤 false 值,则可以使用。x => !x
评论