LinQ Any()是否会在集合中投射所有项目?

时间:2013-02-20 16:47:34

标签: c# .net linq

我知道当Linq的Any()扩展用于确定一个枚举是否至少有一个元素时,它只会消耗一个元素。但这实际上是如何运作的?是否必须首先将所有项目投射到可枚举中,或者是否一次只投出一个项目,从第一个开始并停在那里?

3 个答案:

答案 0 :(得分:4)

Any()适用于IEnumerable<T>,因此不需要演员表。它的实现非常简单,它只是遍历可枚举,并查看它是否可以找到符合指定条件的任何元素。

答案 1 :(得分:2)

简单实现如下:

public bool Any<T>(IEnumerable<T> list)
{
    using (var enumerator = list.GetEnumerator())
    {
        return enumerator.MoveNext();
    }
}

所以,不需要任何演员

答案 2 :(得分:1)

公共静态类Enumerable中的代码:

public static bool Any<TSource>(this IEnumerable<TSource> source) {
    if(source==null) {
        throw Error.ArgumentNull("source");
    }
    using(IEnumerator<TSource> enumerator=source.GetEnumerator()) {
        if(enumerator.MoveNext()) {
            return true;
        }
    }
    return false;
}

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 local in source) {
        if(predicate(local)) {
            return true;
        }
    }
    return false;
}

没见过铸造,但是通用。