【问题标题】:Fastest implementation of IList<T>/ICollection<T> in terms of adding/removing an elementIList<T>/ICollection<T> 在添加/删除元素方面的最快实现
【发布时间】:2012-08-09 18:44:13
【问题描述】:

我在一个广泛使用T.Add/Remove 方法的类(我们称之为MyClass)中发现了一些非常讨厌的代码。此外,同一个类将该集合公开为具有 T 类型 IList 的属性,因此更改类型将涉及一些重构。

此外,MyClass 集合用作事件侦听器对象的容器,因此客户端代码只需订阅(将自身添加到集合中)和取消订阅(将自身从集合中删除)。顺序无关紧要,无论是列表的开始/中间/结束。

为了提高性能,我想替换内部实现细节,将 List of T 替换为.... 不知道是什么。我尝试了 T 的 LinkedList,但它没有实现 T 的 IList。我查看了IList of T at MSDN,但没有实现 IList 的类列表,因此我可以比较文档。

另一件事是我试图将 T 的 IList 更改为 T 的 ICollection,这可能是一个解决方案(因为 MyClass 的客户端代码使用添加/删除方法,因此无需重构)但有趣的事情发生了:

        LinkedList<string> list = new LinkedList<string>();
        list.Add("test");

此代码无法编译,因为我收到错误:

'System.Collections.Generic.LinkedList' 不包含 “添加”的定义,没有扩展方法“添加”

但是当我把它改成:

        ICollection<string> list = new LinkedList<string>();
        list.Add("test");

然后我工作了。您能否解释一下为什么第一个示例没有编译 + 说明 .NET Framework 中 T 的 IList 在添加/删除项目方面的最快实现是什么?

谢谢。

【问题讨论】:

  • 您试图提高性能的事实似乎与问题的其余部分无关......请随时从标题中删除。
  • 其实关于 MyClass 和性能的故事是一个支线剧情。不过,我的问题是“添加/删除收藏品的最快方法是什么”

标签: c# .net c#-4.0 collections


【解决方案1】:

LinkedList&lt;T&gt; 基本上使用explicit interface implementation 实现ICollection&lt;T&gt;。因此,Add 方法仅在您将其“视为”ICollection&lt;T&gt; 时可用。

关键是,如果您知道自己使用的是链表,则应该改用AddFirstAddLast

【讨论】:

    【解决方案2】:

    没有一个类在添加和删除方面速度最快。它们都是为了在某些情况下更快而构建的,它们也都有其缺点。 List 在大多数情况下可以快速添加到末尾,但它会定期进行昂贵的添加,涉及复制每个元素。当您开始在接近开始时添加项目时,它会变得越来越昂贵。移除在最后很便宜,而随着您开始,成本会越来越高。

    LinkedList 可以有效地添加到开头或结尾,但是这些添加仍然比添加到 List 的末尾要慢很多(但没有任何非常大的添加)。添加到LinkedList 开头或结尾以外的位置会很快变得昂贵。在大多数实际情况下,从性能的角度来看,LinkedList 并不是一个好的选择。

    我可以继续,但需要一段时间。重点仍然是,我们需要了解有关如何使用集合的更多详细信息,以便提出更高性能的替代方案(或使用现有集合的不同方式)。

    由于您已经描述了您所拥有的只是一组不需要排序的数据,只需要有效地添加/删除/迭代所有最佳集合就是HashSet&lt;T&gt;。您可以自己对基于散列的数据结构的内部工作进行一些研究(这很酷),但关键是它是一个 无序 数据结构,可以非常有效地添加/删除元素,并且你可以有效地迭代。这非常适合您的情况。使用基于散列的数据结构要记住的一件事是,您的对象需要具有有意义的 GetHashCodeEquals 的实现(默认的通常不适用于您的自定义类型)。如果您使用 intstring 之类的东西作为键,那么它已经有了很好的实现。

    【讨论】:

    • 谢谢。我不清楚。基本上,该集合用作事件侦听器类的容器,因此客户端代码只需订阅(将自身添加到集合中)和取消订阅(将自身从集合中删除)。顺序无关紧要,无论是列表的开始/中间/结束。我已将这个推荐添加到问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多