【发布时间】:2011-12-18 23:35:40
【问题描述】:
可能重复:
Why does Enumerable.All return true for an empty sequence?
代码:
var line = "name:";
Console.Write(line.Split(new char[] { ':' })[1].All(char.IsDigit));
这怎么可能?它不应该返回假吗? after: 是一个空字符串。
【问题讨论】:
可能重复:
Why does Enumerable.All return true for an empty sequence?
代码:
var line = "name:";
Console.Write(line.Split(new char[] { ':' })[1].All(char.IsDigit));
这怎么可能?它不应该返回假吗? after: 是一个空字符串。
【问题讨论】:
这是一个vacuously true 表达式。
所有字符都是数字,因为你找不到反例。这段代码:
return s.All(char.IsDigit);
大致相当于这个循环:
foreach (char c in s)
{
if (!char.IsDigit(c)) { return false; }
}
return true;
在这个重写的版本中,应该清楚的是,如果字符串中没有字符,则永远不会输入循环体,因此结果为真。
【讨论】:
这是因为两个原因:
正如您在 幻像编辑更新 中提到的,您的索引条件会抓取 Split 返回的数组中的 second 条目(C# 从 0 开始计数)
var parts = line.Split(new char[] { ':' });
// parts[0] == "name";
// parts[1] == "";
如果输入序列为空,Enumerable.All<TSource>(...) 返回true
返回值
类型:System.Boolean 如果源序列的每个元素都通过指定谓词中的测试,或者序列为空,则为 true;否则为假。
【讨论】:
如果源序列的每个元素都通过了测试,则为真 指定谓词,或者如果序列为空;否则为假。
【讨论】: