Nit*_*kin 6 c# linq performance
在对Linq IEnumerable
扩展方法进行反编译之后,我很高兴看到
该Count()
方法在尝试迭代整个可枚举之前尝试将其向下转换为ICollection
或者ICollection<T>
例如:
public static int Count<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
ICollection<TSource> collectionoft = source as ICollection<TSource>;
if (collectionoft != null) return collectionoft.Count;
ICollection collection = source as ICollection;
if (collection != null) return collection.Count;
int count = 0;
using (IEnumerator<TSource> e = source.GetEnumerator()) {
checked {
while (e.MoveNext()) count++;
}
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
为什么不发生这种情况Any()
?它不会从使用.Count > 0
而不是创建数组枚举器中受益吗?
并非所有集合都提供O(1)Count
属性访问权限.例如,访问计数属性ConcurrentQueue<T>
是O(n).因此,优化会使情况变得更糟,因此不应将其称为优化.
不仅ConcurrentQueue<T>
,几乎所有的并发集合(ConcurrentDictionary<TKey,TValue>
,ConcurrentStack<T>
等)属于这一类
可能这就是他们决定不这样做的原因.