为什么C#Linq Count()方法缺少IReadOnlyCollection?

时间:2017-03-29 10:47:52

标签: c# linq generics collections

这是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,即使没有使用它......

1 个答案:

答案 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都有特定的代码。如果你想要你可以自我扩展。但是,可能,命名可以更好