【发布时间】:2011-01-12 19:26:22
【问题描述】:
所以我今天遇到了一种情况,其中一些生产代码恰好因为一个方法完全按照documented in MSDN 执行而失败。为不阅读文档而感到羞耻。然而,我仍然在摸不着头脑为什么它的行为方式,即使是“设计”,因为这种行为与我的预期完全相反(以及其他已知行为)并且因此似乎违反了最小意外原则。
All() 方法允许您提供谓词(例如 lambda 表达式)来测试 IQueryable,返回一个布尔值,指示是否所有集合成员都匹配测试。到目前为止,一切都很好。这就是它变得奇怪的地方。如果集合为空,All() 也会返回 true。这对我来说似乎完全倒退了,原因如下:
- 如果集合是空的,这样的测试充其量是未定义的。如果我的车道是空的,我不能断言停在那里的所有汽车都是红色的。有了这种行为,在空荡荡的车道上停放的所有汽车都是红色和蓝色和棋盘格 - 所有这些表达式都将返回 true。
- 对于熟悉 NULL != NULL 的 SQL 概念的任何人来说,这是出乎意料的行为。
-
Any()方法的行为符合预期,并且(正确)返回 false,因为它没有任何与谓词匹配的成员。
所以我的问题是,为什么All() 会这样?它解决了什么问题?这是否违反了最小意外原则?
我将此问题标记为 .NET 3.5,但该行为也适用于 .NET 4.0。
编辑好的,所以我掌握了这一点的逻辑方面,正如 Jason 和你们其他人所阐述的那样。诚然,空集合是一种极端情况。我想我的问题源于这样的斗争,仅仅因为某些东西是逻辑并不意味着如果你的心态不正确,它就一定是有意义。
【问题讨论】:
-
False 表示即使没有谓词,查询也没有返回任何结果。这只是说明我在输入此内容时 Dested 发布的内容的不完整方式。
-
我正在从您的帖子中删除 [
subjective] 标签;这不是一个主观问题。这些是逻辑规则,它们非常合乎逻辑。一旦你对这些想法进行了足够的练习,它们就会变得直观。 -
“它们变得直观...” 是的,我在大学学习逻辑表等... 15 年前。 :)
-
我的想法是关于它是否具有“实用”意义的意见分歧取决于你在练习什么。如果您关心“所有”的意思是“没有相反的实例”,那么硬逻辑定义非常适合您。但是对于许多问题,我们可能正在寻找“没有相反的实例,并且至少有一个我想要的场景的实例”。这实际上是两个声明,所以这将是 Linq 中的两个不同条件。计数(条件)> 0 和全部(条件)。我确实很好奇是否有一种聪明的方法可以做到这一点。