【问题标题】:why this condition returns true? [duplicate]为什么这个条件返回真? [复制]
【发布时间】: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: 是一个空字符串。

【问题讨论】:

    标签: c# .net string


    【解决方案1】:

    这是一个vacuously true 表达式。

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

    return s.All(char.IsDigit);
    

    大致相当于这个循环:

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

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

    【讨论】:

    • 为好的维基百科链接点赞,从来不知道有一个名字:)
    【解决方案2】:

    这是因为两个原因:

    1. 正如您在 幻像编辑更新 中提到的,您的索引条件会抓取 Split 返回的数组中的 second 条目(C# 从 0 开始计数)

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

      返回值

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

    【讨论】:

      【解决方案3】:

      Enumerable.All

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 2020-05-02
        • 2013-03-20
        相关资源
        最近更新 更多