C#.NET分拣不良的容器

C#.NET分拣不良的容器,c#,containers,sorted,C#,Containers,Sorted,我将用C#编写一个基于事件的模拟器。我需要一个具有以下功能的调度程序排序容器: 键值对按键(时间、委托对)排序存储 按键高效插入和删除(删除最小的项,插入是任意的) 可以查询最小的项(键值对) 我需要的实际上是一个非常基本的二叉树或排序队列或类似的东西。但是我在.NET中的选项——SortedList和SortedDictionary——并不令人满意。第一个在插入和删除方面存在效率问题,第二个在查询最小项方面存在问题 我应该开始实现自己的容器,还是遗漏了什么?真是难以置信,没有一个内置的容器

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

  • 键值对按键(时间、委托对)排序存储
  • 按键高效插入和删除(删除最小的项,插入是任意的)
  • 可以查询最小的项(键值对)
我需要的实际上是一个非常基本的二叉树或排序队列或类似的东西。但是我在.NET中的选项——SortedList和SortedDictionary——并不令人满意。第一个在插入和删除方面存在效率问题,第二个在查询最小项方面存在问题

我应该开始实现自己的容器,还是遗漏了什么?真是难以置信,没有一个内置的容器能满足我的需要

谢谢


(更新:我在.NET 2下寻找一个解决方案)

如果.NET集合不提供你要查找的功能和性能,如果.NET集合不能提供你要查找的功能和性能,你可能想考虑.< /p>< p>如果你自己跟踪最小的项目,你可能想考虑.< /p>< p>你仍然可以使用<代码> SortedDictionary <代码>。 但是我和@Frédéric有同样的问题-
sortedDictionary.First()
有什么问题

编辑:根据Frédéric的建议,
可枚举。首先,
实现.NET 2.0:

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

    throw new InvalidOperationException("The source sequence is empty.");
}
public static T First(IEnumerable items)
{
foreach(项目中的T项目)
退货项目;
抛出新的InvalidOperationException(“源序列为空”);
}

如果您自己跟踪最小的项目,您仍然可以使用
分类词典

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

编辑:根据Frédéric的建议,
可枚举。首先,
实现.NET 2.0:

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

    throw new InvalidOperationException("The source sequence is empty.");
}
public static T First(IEnumerable items)
{
foreach(项目中的T项目)
退货项目;
抛出新的InvalidOperationException(“源序列为空”);
}


使用
分类词典
自己记录最小的条目?@Tim Robinson-听起来像个答案?!?sortedDictionary.First()有什么问题?@Pieter我认为这是显而易见的,所以我可能错过了point@Tim罗宾逊——OP想要的往往是一个简单的解决方案。我可以随时试一试+1适合你。使用
SortedDictionary
自己记录最小的项目?@Tim Robinson-听起来像个答案?!?sortedDictionary.First()有什么问题?@Pieter我认为这是显而易见的,所以我可能错过了point@Tim罗宾逊——OP想要的往往是一个简单的解决方案。我可以随时试一试+1.这实际上是不可能的,因为最小的物品会从容器中取出。因此,在删除它之后,我必须再次获得最小值…我真的认为答案是
首先
-请参阅我的编辑。(即使Microsoft在新版本的框架中添加了功能,您仍然可以在旧版本中重新实现它。)是的,您是对的!我从来没有想过要重新实现这个简单的函数:)谢谢你和所有其他人的宝贵答案!(只是一句话。我不理解MS为什么不能添加一些更灵活的排序容器。实际上有一些基本功能尚未实现。例如,排序容器中存在重复的键。好吧,我停止哭泣:))这是不可能的,因为最小的项目已从容器中删除。因此,在删除它之后,我必须再次获得最小值…我真的认为答案是
首先
-请参阅我的编辑。(即使Microsoft在新版本的框架中添加了功能,您仍然可以在旧版本中重新实现它。)是的,您是对的!我从来没有想过要重新实现这个简单的函数:)谢谢你和所有其他人的宝贵答案!(只是一句话。我不明白为什么MS不能添加一些更灵活的排序容器。实际上有一些基本功能尚未实现。例如,排序容器中存在重复的键。好吧,我停止哭泣:))谢谢,我来看看。谢谢,我来看看。