为什么这种情况会回归真实

时间:2011-10-31 18:49:45

标签: c# .net string

  

可能重复:
  Why does Enumerable.All return true for an empty sequence?

代码:

var line = "name:";
Console.Write(line.Split(new char[] { ':' })[1].All(char.IsDigit)); 

怎么可能?它不应该返回虚假?在:之后是一个空字符串。

3 个答案:

答案 0 :(得分:15)

Enumerable.All

  

如果源序列的每个元素都通过了测试,则为true   指定谓词,或序列为空;否则,错误。

答案 1 :(得分:8)

这是一个vacuously true表达式。

所有字符都是数字,因为您找不到反例。这段代码:

return s.All(char.IsDigit);

大致相当于这个循环:

foreach (char c in s)
{
    if (!char.IsDigit(c)) { return false; }
}
return true;

在这个重写版本中,应该很清楚,如果字符串中没有字符,那么循环体将永远不会被输入,因此结果为真。

答案 2 :(得分:6)

这是因为两个原因:

  1. 幻像编辑更新中所述,您的索引条件会抓取Split返回的数组中的第二个条目(C#计数从0)

    var parts = line.Split(new char[] { ':' });
    // parts[0] == "name";
    // parts[1] == "";
    
  2. 如果输入序列为空,则
  3. Enumerable.All<TSource>(...)返回true

      

    返回值

         

    类型:System.Boolean   如果源序列的每个元素都通过指定谓词中的测试,或者序列为空,则返回true;否则返回false。否则,错误。