C#Linq All&空白数组的任何工作方式都不同

时间:2016-08-11 14:32:50

标签: c# linq

考虑使用空白数组的linq示例:

Any()返回false因为没有大于零的数字时,All()如何返回true传达所有大于零的数字?

var arr = new int[] { };
Console.WriteLine(arr.Any(n => n > 0)); //false 
Console.WriteLine(arr.All(n => n > 0)); //true 

4 个答案:

答案 0 :(得分:58)

对我来说似乎很合乎逻辑。

  • Allarr中的所有数字是否大于零(意味着没有数字更大比零)=> true
  • Anyarr中的任何号码是否大于零=> false

但更重要的是,根据Boolean Algebra

arr.All(n => n > 0); 

给出true,因为它应该是

逻辑相反
arr.Any(n => !(n > 0));

给出false(实际上这就是上面两点所说的)。

答案 1 :(得分:24)

All的实施非常清楚地显示了原因。

    public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
        if (source == null) throw Error.ArgumentNull("source");
        if (predicate == null) throw Error.ArgumentNull("predicate");
        foreach (TSource element in source) {
            if (!predicate(element)) return false;
        }
        return true;
    }

它在集合上运行foreach。如果集合中没有元素,它将跳过foreach并返回true。

有趣的是,Any

上的实施
    public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
        if (source == null) throw Error.ArgumentNull("source");
        if (predicate == null) throw Error.ArgumentNull("predicate");
        foreach (TSource element in source) {
            if (predicate(element)) return true;
        }
        return false;
    }

这个清晰显示他们是对立的。

答案 2 :(得分:5)

如果列表中没有元素,则All

The implementation将返回true:

public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
    if (source == null) throw Error.ArgumentNull("source");
    if (predicate == null) throw Error.ArgumentNull("predicate");
    foreach (TSource element in source) {
        if (!predicate(element)) return false;
    }
    return true;  // watch this
}

这似乎非常违反直觉,但这是如何实施的。

然而,文档对于All的返回值非常清楚:

  

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

答案 3 :(得分:3)

一些数学观点: AnyAll||&&运算符的通用版本,就像SumProduct(不在LINQ中)是{的一般化{1}}和+

处理空集的返回neutral element时的广义运算符。对于*,这是0,对于+,这是1 *,因为1是emptyArray.Product() == 1操作的中性元素(对于所有a:*), a * 1 == a这是||false),而a || false == a这是&&true)。

由于这种广义的操作符保留了&#34;原始&#34;的关联性。操作,例如求和:a || true == a,即使其中一个intersect(A,B) == EmptySet; S = union(A,B); S.Sum() == A.Sum() + B.Sum()A为空,这也会有用。换句话说,在数组上方便定义空集上的广义运算符返回中性元素。