Cui*_*崔鹏飞 100 .net c# linq enumerable
var strs = new Collection<string>();
bool b = strs.All(str => str == "ABC");
Run Code Online (Sandbox Code Playgroud)
代码创建一个空的字符串集合,然后尝试确定集合中的所有元素是否为"ABC".如果你运行它,b
将是真的.
但是该集合甚至没有任何元素,更不用说任何等于"ABC"的元素了.
这是一个错误,还是有合理的解释?
Jon*_*eet 151
这肯定不是一个bug.它的行为完全符合记录:
如果源序列的每个元素都通过指定谓词中的测试,或者序列为空,则返回 true;否则返回false .否则,错误.
现在你可以争论它是否应该以这种方式工作(对我来说似乎很好;序列的每个元素都符合谓词)但是在你询问某些东西是否是一个bug之前首先要检查的是文档.(只要方法的行为与您预期的方式不同,这是首先检查的.)
Mr.*_*tty 10
All要求谓词对序列的所有元素都是真的.这在文档中明确说明.如果你认为All是一个逻辑的,并且在谓词的每个元素的结果之间,这也是唯一有意义的事情.你得到的空序列的"真实"是和操作的标识元素.同样,对于空序列,您从Any获得的错误是逻辑或逻辑的标识.
如果你认为"所有"是"序列中没有元素没有",那么这可能更有意义.
它是true
,因为没有(没有条件)成功false
.
文档可能会解释它.(Jon Skeet几年前也提到了一些事情)
这同样适用于Any
(的对面All
返回)false
为空集.
编辑:
您可以想象All
在语义上实现与以下相同:
foreach (var e in elems)
{
if (!cond(e))
return false;
}
return true; // no escape from loop
Run Code Online (Sandbox Code Playgroud)
这里的大多数答案似乎都遵循“因为这就是定义的方式”。但也有一个合乎逻辑的原因,为什么这样定义。
定义函数时,您希望函数尽可能通用,以便它可以应用于尽可能多的情况。例如,假设我想定义一个Sum
函数,它返回列表中所有数字的总和。当列表为空时它应该返回什么?如果您要返回一个任意 number x
,则将该函数定义为:
x
如果列表为空。但如果x
为零,您也可以将其定义为
x
加上给定数字的函数。请注意,定义 2 暗示了定义 1,但 1 在x
不为零时并不暗示 2 ,这本身就是选择 2 而非 1 的充分理由。但也注意 2更优雅,并且就其本身而言,比 1 更通用。就像将聚光灯放在更远的地方,以便照亮更大的区域。实际要大很多。我自己不是数学家,但我相信他们会发现定义 2 和其他数学概念之间的大量联系,但与定义 1 相关的x
不是零。
一般来说,只要有一个函数对一组元素应用二元运算符并且该集合为空,就可以并且很可能希望返回标识元素(使另一个操作数保持不变的元素)。这与Product
当列表为空时函数将返回 1 的原因相同(请注意,您可以x
在定义 2 中将“加号”替换为“一次”)。And is the same reason All
(可以认为是逻辑AND运算符的重复应用)true
在列表为空时会返回(p && true
相当于p
),同样的原因Any
(OR运算符)会返回false
。
归档时间: |
|
查看次数: |
28389 次 |
最近记录: |