原文地址:http://blog.csdn.NET/caesarliu1121/article/details/24775249
现在网上谈到Linq中的判断集合非空基本都说要用Any比Count好. 但真实情况是这样的吗?
首先我们要从Any和Count的差别说起.Any() 使用IEnumerator.GetEnumerator() 和 MoveNext() 來判断是否集合为空,而Count()则是返回整个集合的元素个数. 就像网上大多数文章所说的, Count() > 0 遇上 yeild return必定会出现性能问题。因为当遇到使用 yield return 返回集合的方法時,如果使用了 Count() 的話,就相当于遍历一遍整个集合然后得到集合个数。最典型的就是LINQ to SQL等对外部数据进行Linq去操作.
并且网上还有说法称Any在.Net内建的集合类型上会退化成Count.这样看来貌似Any是比Count更好的一个选择.但Caesar我从反编译的.Net代码来看好像不是这样.是我有什么地方遗漏了吗?我决定直接测试一下.
通过多次的测试, Any函数所花的时间基本是Count函数的两倍多.
其中一次的结果如下.
Any: 151462
Count: 60816
当然这个测试还比较简单. 最好是用上老赵的性能计数器.(http://www.cnblogs.com/JeffreyZhao/archive/2009/03/10/codetimer.html)
那为什么Any()会比Count()慢呢? 原因也很简单.因为Any() 需要GetEnumerator() / MoveNext() / Dispose() ,虽然只有一次,但也是要花资源的。而对内建类型 Count()基本就是一个读取操作.
结论:
- 当集合是來自不确定个数的IEnumerable<T>时,请使用 Any().
- 当集合是來自外部数据 (ex: LINQto SQL, LINQ to Entities) 时,请使用 Any().
- 当集合是來自 .NET Framework 內建的集合时,请使用 Count() .