2013-02-20 72 views
0

我知道Linq的Any()扩展名用于确定一个枚举是否至少有一个元素,它只会消耗一个元素。但实际上这是如何工作的?它是否必须首先将所有物品放在可枚举物体中,还是一次只投出一个物体,从第一个开始并停在那里?LinQ Any()是否强制集合中的所有项目?

+4

为什么你甚至会怀疑演员阵容? – 2013-02-20 16:49:26

+3

我怀疑你正在使用'cast'来表示除了普遍接受的含义之外的东西。你认为这意味着什么? – AakashM 2013-02-20 16:50:46

回答

4

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

+1

这对于需要一个函数的重载来说,另一个无参数重载,同时分享一个名字,行为完全不同。 – Servy 2013-02-20 16:54:17

+0

是的。并非所有版本都有谓词。但总的想法是一样的:是否有任何元素,可选地匹配给定的标准?无论哪种情况,数据都不需要转换。 – 2013-02-20 16:55:57

+0

而且不带谓词的版本基本上是'Any(x => true)'的垫片。 – GalacticCowboy 2013-02-20 17:03:54

2

简单实现的样子:

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

所以,没有任何铸件所需

+0

LINQ版本是通用的,您需要处理枚举器,并且不会检查输入序列,但除此之外道德上相同。 – Servy 2013-02-20 16:55:05

+0

@Servy:谢谢,我知道,只是为了便于理解而简化它 – 2013-02-20 16:56:32

+0

空检查和泛型并不重要,但处置枚举器确实是,并且不应该被省略。 – Servy 2013-02-20 16:57:22

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; 
} 

没有见过铸造,但通用的。

相关问题