【问题标题】:Frequent inserts into sorted collection频繁插入排序集合
【发布时间】:2011-03-18 11:55:39
【问题描述】:

我已经对集合(列表)进行了排序,我需要始终保持它的排序。

我目前在我的集合中使用 List.BinarySearch,然后在正确的位置插入元素。我也尝试在每次插入后对列表进行排序,但性能无法接受。

有没有可以提供更好性能的解决方案?也许我应该使用其他收藏。

(我知道 SortedList 但仅限于唯一键)

【问题讨论】:

  • 您要排序的类型是什么?...string, int, other..

标签: c# .net performance collections


【解决方案1】:

尝试将插入聚合成批次,并仅在每个批次的末尾进行排序。

【讨论】:

    【解决方案2】:

    如果您使用的是 .Net 4,则可以使用 SortedSet<T>

    http://msdn.microsoft.com/en-us/library/dd412070.aspx

    对于 .Net 3.5 及更低版本,查看 SortedList<TKey,TValue> 是否适合您。

    http://msdn.microsoft.com/en-us/library/ms132319.aspx

    【讨论】:

    • SortedSet 不允许重复。 SortedList 也不会
    【解决方案3】:

    PowerCollections 有一个 OrderedBag 类型,它可能适合您的需要。来自文档

    插入、删除和查找 一个元素都在 log(N) + M 中完成 时间,其中N是键的数量 树,M 是当前数 元素的副本是 处理。

    但是,对于 .NET 3.5 内置类型,使用 List.BinarySearch 并将每个项目插入正确的位置是一个好的开始 - 但它在内部使用数组,因此您的性能会因所有复制而下降插入时执行。

    如果您可以将您的插入分组为可以改进事情的批次,但除非您在所有插入之后可以只进行一次排序操作,否则您最好使用PowerCollections 中的OrderedBag(如果可以)。

    【讨论】:

    • PowerCollections 及其 OrderedBag 很棒,但我最终使用了优先队列(在 .NET 中也不可用)
    • 6年后还是这样吗?
    • @mcmillab 我还没有查看性能,但如果我今天需要这个,我会从 C5 Collections 开始,然后查看 TreeBag
    猜你喜欢
    • 2018-05-08
    • 2021-09-06
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    相关资源
    最近更新 更多