在对集合进行迭代/预处理之前,是否有任何速度改进或确实指向检查可枚举的Count()
?
List<int> numbers = new List<int>();
if(numbers.Count() > 0)
{
foreach(var i in numbers) {/*Do something*/}
}
答案 0 :(得分:18)
不,反之亦然。如果它不是一个集合(如List
或Array
),而是一个延迟执行的查询,它必须完全执行,这可能非常昂贵,只是为了确定计数。在您的示例中,它实际上是List
,Enumerable.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
更差