Why does IQueryable.All() return true on an empty collection?
所以我今天遇到了这样一种情况:一些生产代码之所以失败,正是因为有一种方法的执行与msdn中所记录的完全相同。我很遗憾没有阅读文档。然而,我仍然在绞尽脑汁地思考它为什么会这样做,即使是"按设计",因为这种行为与我预期的完全相反(以及其他已知的行为),因此似乎违反了最不令人惊讶的原则。
- 如果集合为空,那么这样的测试最多是未定义的。如果我的车道是空的,我不能断言所有停在那里的车都是红色的。有了这种行为,在一条空车道上,所有停在那里的车都有红蓝相间的棋盘格——所有这些表达式都会返回真值。
- 对于任何熟悉SQL概念的人来说,这是空的!=空,这是意外行为。
Any() 方法的行为与预期一致,并且(正确地)返回false,因为它没有任何与谓词匹配的成员。
所以我的问题是,为什么
我将这个问题标记为.NET 3.5,尽管这种行为也适用于.NET 4.0。
编辑好了,所以我掌握了这方面的逻辑,就像杰森和你们其他人所做的那样。诚然,一个空的集合有点像一个边缘案例。我想我的问题根源于这场斗争,仅仅因为某些事情是合乎逻辑的,并不意味着如果你没有处于正确的心态中,这就必然是有意义的。
If my driveway is empty, I cannot assert that all cars parked there are red.
号
考虑以下陈述。
S1 : My driveway is empty.
S2 : All the cars parked in my driveway are red.
号
我声称
~S2 : There exists a car parked in my driveway that is not red.
号
S1 ^ ~S2 : My driveway is empty and there exists a car parked in my driveway that is not red.
号
只有当
因此,如果你的车道是空的,你可以断言所有停在那里的车都是红色的。
现在让我们考虑一个
1 | bool b = elements.All(x => p(x)); |
让我们考虑一下它的否定
1 | bool notb = elements.Any(x => !p(x)); |
号
为了使
还有一种方法可以考虑这个问题。如果在
现在,当
最后,本文对当
如果返回
1 | Driveway.Cars(a => a.Red).Count() == Driveway.Cars.Count() |
相关说明:为什么"abcd".startswith(")返回true?
"If the collection is empty, a test
like this is, at best, undefined. If
my driveway is empty, I cannot assert
that all cars parked there are red."
号
是的,你可以。
为了证明我错了,让我看看你空车道上一辆不是红色的车。
For anyone familiar with the SQL notion that NULL != NULL, this is unexpected behavior.
号
这是SQL的一个怪癖(不完全正确:
"any"表示存在谓词为真的项。对于空集合,这将是错误的。
"全部"表示不存在谓词为假的项。对于空集合,这始终是正确的。
我认为这是有道理的。在逻辑上,对所有事物的补充是不存在的。因为一切都像江户记1(7)。存在着类似于
因此,
因为对一个空集合的任何命题都是一个空洞的真理。
你会在数学或计算机科学的其他领域经常发现这种行为。
如果范围无效(从0到-1的总和),Math中的sum运算符将返回0(零元素+)。multipyl运算符将返回1(用于乘法的中性元素)。
现在,如果您有布尔表达式,它非常相似:或的中性元素是
现在关于Linq的
1 2 | ANY = a OR b OR c OR d ... ALL = a AND b AND c AND d ... |
号
所以,如果你有数学/cs背景,这种行为就是"你所期望的"。
返回
因此,对于空的托收,
它非常类似于数字0的基本概念。即使它代表着缺席的存在,它仍然拥有并代表着一个价值。iqueryable.all()应返回true,因为它将成功返回集合的所有成员。如果集合为空,则函数不会返回任何成员,但不会返回任何成员,因为函数无法返回任何成员。这仅仅是因为没有成员可以返回。也就是说,为什么iqueryable.all()必须经历失败,因为缺乏集合的支持?它是自愿的,它是有能力的……它是有能力的。在我看来,这些收藏品没法维持他们的交易…
http://mathforum.org/dr.math/faq/faq.divideby0.html
false表示查询没有返回任何结果,即使没有谓词。这只是一个不完整的方式来说明什么目的地张贴当我打字这个。