我是否需要在foreach之前检查Enumerable的Count()

时间:2014-01-08 08:45:55

标签: c#

在对集合进行迭代/预处理之前,是否有任何速度改进或确实指向检查可枚举的Count()

List<int> numbers = new List<int>();

if(numbers.Count() > 0)
{
    foreach(var i in numbers) {/*Do something*/}
}

5 个答案:

答案 0 :(得分:18)

不,反之亦然。如果它不是一个集合(如ListArray),而是一个延迟执行的查询,它必须完全执行,这可能非常昂贵,只是为了确定计数。在您的示例中,它实际上是ListEnumerable.Count非常聪明,可以先尝试将其强制转换为ICollection<T> / ICollection。如果成功,则使用Count属性。

所以只需使用foreach即可。如果序列为空则不会受到影响,循环将立即退出。

出于同样的原因,如果您只想检查序列是否包含至少一个元素,最好使用Enumerable.Any而不是Count() > 0。意图也更明确。

答案 1 :(得分:2)

如果你的Enumarable是懒惰评估的(LINQ),那么对Count()的调用实际上非常糟糕,因为它会评估整个Enumerable。

由于如果Enumarable为空,foreach不会执行,最好不要使用Count

答案 2 :(得分:1)

我不相信在对集合进行迭代/预处理之前,检查可枚举的Count()是否有任何速度改进或确实有意义。因为如果集合中没有任何项目,则不会在foreach块中执行代码。

答案 3 :(得分:1)

简短回答:不,相反。
更长的答案:foreach关键字调用IEnumerator界面上的方法。这些方法隐式检查存在的项目。所以调用Count()纯粹是多余的。

答案 4 :(得分:0)

即使您要检查计数,也要使用Count而不是扩展方法Count(),因为Count()的性能比Count

更差