.NET中是否存在已排序的队列?

我需要一个相当专业的.NET集合,我不认为BCL可以帮助我,但我想如果有人知道类似的话,我会把它扔出去。

基本上,我的要求是:

  • 我有一对值列表,例如:(3,10),(5,10),(3,7),(5,5)
  • 订单很重要,即。 (3,10)!=(10,3)
  • 单个值的副本很好,但应删除重复对(最好是静默)。
  • 踢球者是,我需要这个列表一直排序。 我只对任何时候排序算法定义的列表中的第一个值感兴趣。

所以,我希望能够做的一些示例代码(正如我设想的那样可能会实现,其他适合上述的实现都可以):

public class Pair { public Pair(int first, int second) { First = first; Second = second; } public int First { get; set; } public int Second { get; set; } } SortedQueue foo = new SortedQueue((left, right) => { return right.First - left.First; }); foo.Add(new Pair(10, 3)); foo.Add(new Pair(4, 6)); foo.Add(new Pair(6, 15)); foo.Add(new Pair(6, 13)); // This shouldn't cause a problem Pair current = foo.Shift(); // current = (4, 6) 

我引用:

我需要这个列表一直排序。 我只对任何时候排序算法定义的列表中的第一个值感兴趣。

这听起来像你想要一个排序队列而是一个优先级队列 。 如果性能是一个问题,那么PQ肯定会更快,O(log n)vs O(n)。 但是drop-duplicatelicates问题需要你保持一个并行的HashSet <>。

你看过SortedDictionary还是SortedList ?

查看已经具有您正在寻找的实现的C5通用集合库 ,称为IntervalHeap或Priority Queue。 以下是C5 Book: IPriorityQueue的一些文档

.NET目前没有内置任何内容满足您的所有要求。 在.NET 4.0中有一个SortedSet类。 我意识到现在可能对你没什么好处。

如果您实现IComparable,SortedList会关闭。 您只需使用Pair作为键和值。 您只需将对两次的引用存储两次,因此不会产生巨大的内存开销。 但这不会照顾重复。

有很多方法可以自己编写,但没有任何内置完全符合您的需求。 有一些开源的SortedSet实现(例如Spring.Net中有一个)。 这可能是你现在最好的选择。

SortedList是最好的,你所要做的就是在你的Pair类中实现IComparable,它会自动对它们进行排序。 至于删除重复项,我不认为Sorted列表处理它,但您可以inheritance它,并添加此function。

你很可能会使用Lookup类,因为The Skeet在他的回答中提到过。 然后你用这样的东西构建和访问它:

 List> yourList = new List>(); yourList.Add(new Lookup(3,5)); //... var list = from item in yourList orderby list.Key //or whatever sort criteria you want here select item; //use list 

语法可能有点偏离1或2个点,但它应该工作。