【问题标题】:C# .NET poor sorted containersC# .NET 排序不佳的容器
【发布时间】:2010-11-11 11:10:01
【问题描述】:

我要用 C# 编写一个基于事件的模拟器。我需要一个用于调度程序的排序容器,它具有以下功能:

  • 键 - 值对按键排序存储(时间、委托对)
  • 高效的按键插入和删除(最小的项目被删除,插入是任意的)
  • 可查询最小项(键值对)。

我需要的实际上是一个非常基本的二叉树或排序队列或类似的东西。但是我在 .NET 中的选项——SortedList 和 SortedDictionary——并不令人满意。第一个存在插入和删除的效率问题,第二个存在查询最小项的问题。

我应该开始实现自己的容器还是我错过了什么?令人难以置信的是没有适合我需要的内置容器。

谢谢!

(更新:我正在寻找 .NET 2.0 下的解决方案)

【问题讨论】:

  • 使用SortedDictionary 并自己跟踪最小的项目?
  • @Tim Robinson - 听起来像是一个答案?!?
  • sortedDictionary.First() 有什么问题?
  • @Pieter 我认为这很明显,所以我可能错过了重点
  • @Tim Robinson - 通常情况下,OP 正在寻找一个简单的解决方案。总可以试一试。为你 +1。

标签: c# containers sorted


【解决方案1】:

如果您自己跟踪最小的项目,您仍然可以使用SortedDictionary

但我和@Frédéric 有同样的问题 - sortedDictionary.First() 有什么问题?

编辑:根据 Frédéric 的建议,.NET 2.0 的 Enumerable.First 实现:

public static T First(IEnumerable<T> items)
{
    foreach (T item in items)
        return item;

    throw new InvalidOperationException("The source sequence is empty.");
}

【讨论】:

  • 这实际上是不可能的,因为最小的项目会从容器中移除。所以去掉它之后,我必须再次得到最小值......
  • 我真的认为答案是First - 请参阅我的编辑。 (即使 Microsoft 在新版本的框架中添加了功能,您仍然可以为旧版本重新实现它。)
  • 是的,你是对的!我从来没有想过要重新实现这个简单的功能 :) 感谢您和所有其他人的宝贵答案!
  • (只是备注。我不明白为什么 MS 不能添加一些更灵活的排序容器。确实有一些基本功能尚未实现。例如排序容器中的重复键。好吧,我停止哭了:))
【解决方案2】:

如果 .NET 集合不能提供您正在寻找的功能和性能,您可能需要考虑C5 library

【讨论】:

  • 谢谢,我去看看。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多