【问题标题】:Why is C# Linq Count() method missing IReadOnlyCollection? [closed]为什么 C# Linq Count() 方法缺少 IReadOnlyCollection? [关闭]
【发布时间】:2017-03-29 10:47:51
【问题描述】:

这是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

【问题讨论】:

  • 我会,因为它不像ICollection 那样通用,它由所有集合类型实现。在性能方面检查每个声明 Count 属性的接口是不合理的。
  • 这对于内置集合来说不是问题,因为它们都实现了 ICollection。

标签: c# linq generics collections


【解决方案1】:

如果您处理过 IReadOnlyCollection,您可以直接从 IReadOnlyCollection 的 Count 属性中获取计数。 https://msdn.microsoft.com/en-us/library/hh881542(v=vs.110).aspx

将一般 Linq Count() 的依赖添加到更具体的 IReadOnlyCollection 是错误的。

UPD

Linq Count() 它是一个与 IEnumerable 一起工作的核心函数,所以它里面的任何转换都只是一些性能黑客。 Count() 扩展不能为每个在某处计数的 IEnumerable 提供特定代码。如果你愿意,你可以自己做扩展。但是,命名可能会更好

【讨论】:

  • 我没有投反对票,但你确实链接了俄罗斯版的 MSDN。
  • @krillgar,谢谢,我已经解决了这个可怕的错误
  • 您的链接是指实现 ICollection 和 IReadOnlyCollection 接口的 ReadOnlyCollection。尤其是因为 IReadOnlyCollection 有一个 Count 属性,我在 Count() 方法中期待它。我说的是一种获取 IEnumerable 参数的方法,该参数可能是 IReadOnlyCollection 或 ICollection。所以我仍然不明白为什么将依赖项从 Linq Count() 添加到 IReadOnlyCollection
  • @EricBDev,操作。我已经更改了语言环境,但将链接更改为错误的文章。固定的。谢谢!
  • @EricBDev, Linq Count() 它是一个与 IEnumerable 一起工作的核心函数,所以它里面的任何转换都只是一些性能黑客。 Count() 扩展不能为每个在某处计数的 IEnumerable 提供特定代码。如果你愿意,你可以自己做扩展。但是,命名可能会更好。
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 2021-05-23
  • 2013-02-02
  • 1970-01-01
  • 2022-10-02
  • 2010-11-04
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多