2012-03-14 77 views

回答

6

Any方法将只迭代必要的最小元素数。只要它找到一个匹配的元素,它将立即返回

这是大致实现如下

public static bool Any<T>(this IEnumerable<T> enumerable, Func<T, bool> predicate) { 
    foreach (var cur in enumerable) { 
    if (predicate(cur)) { 
     return true; 
    } 
    } 
    return false; 
} 

在最坏的情况下(没有或最后一个匹配)将访问所有元素。在最好的情况下(第一次匹配),它将只访问1

+0

我希望是这样,谢谢。我最初使用'Count()> 0',并意识到这是一个非常昂贵的操作。我重新发现了'Any'并且一直在其他地方使用它。:) – Jordan 2012-03-14 16:28:10

2

后者 - 你可以用ReSharper看代码来验证,如果你下载试用版。

至于Any是否有效率 - 这不是例如, Count属性可用作替代。但它确实可以很好地表达意图。

+0

如果IEnumerable 实际上是一个List Count()使用列表的Count属性吗? – Jordan 2012-03-14 16:34:06

+0

这是真的,但我正在处理尚未实现的序列。实际上,我正在编写一个通用库来补充'Enumerable'。所以我不知道给定的序列是什么,只是它实现了'IEnumerable '。我当然可以问,这就是为什么我问过上述问题。我想知道是否需要为'List '和其他具有“Count”或“Length”属性的类型特殊情况。 – Jordan 2012-03-14 16:39:16

+1

如果您正在处理尚未实现的序列,请务必确保它们是否可重复。由于'Any'必须读取序列的一个元素才能完成它的工作,所以在将其应用于不可重复序列时必须小心,否则将失去第一个元素。我一直在看这一段时间,实际上它有助于:http://stackoverflow.com/questions/9194908/safely-checking-non-repeatable-ienumerables-for-emptiness – 2012-03-14 18:08:11

1

只要它找到与谓词的成功匹配,任何就立即返回true,但如果不存在,它将遍历整个集合。

相关问题