这是Why doesn't generic ICollection implement IReadOnlyCollection in .NET 4.5?
的扩展设计和兼容性是主要原因。
当一个方法需要同时获取ICollection和IReadCollection作为参数时,最简单的解决方案是使用IEnumerable,因为它们都扩展了它。
然后,可以使用Linq Count()方法而不是直接使用Count属性。
这是来自https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,41ef9e39e54d0d0b的System.Linq.Enumerable.cs的摘录
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;
}
它首先检查它是否是一个集合,在这种情况下直接返回Count,这样性能成本将是最小的。 但是,为什么这个Count()的实现没有与IReadOnlyCollection类似的检查?
我不认为兼容性是一个问题:用.NET&lt; 4编写的用.NET 4.5+编译的旧代码可以检查IReadOnlyCollection,即使没有使用它......
答案 0 :(得分:0)
如果你已经处理了IReadOnlyCollection,你可以直接从IReadOnlyCollection的Count属性中获取数。 https://msdn.microsoft.com/en-us/library/hh881542(v=vs.110).aspx
将一般Linq Count()的依赖项添加到更具体的IReadOnlyCollection中是错误的。
<强> UPD 强>
Linq Count()它是一个与IEnumerable一起使用的核心功能,所以任何内部的演员只是一些性能黑客。 Count()扩展名不能为每个IEnumerable都有特定的代码。如果你想要你可以自我扩展。但是,可能,命名可以更好