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

时间:2009-09-19 05:23:45

标签: c# collections

我需要一个相当专业的.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<Pair> foo = new SortedQueue<Pair>((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)

6 个答案:

答案 0 :(得分:11)

我引用:

  

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

这听起来像想要排序队列而是Priority Queue。如果性能是个问题,那么PQ肯定会更快,O(log n)vs O(n)。但是重复丢弃问题需要您保持并行HashSet&lt;&gt;同样。

答案 1 :(得分:5)

您是否看过SortedDictionarySortedList

答案 2 :(得分:2)

查看已经具有您正在寻找的实施的C5 Generic Collections Library,称为IntervalHeap或优先级队列。以下是C5 Book中的一些文档:IPriorityQueue<T>

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你最有可能使用Lookup类作为The Skeet在his answer中提到的。然后你用这样的东西构建和访问它:

List<Lookup<int, int>> yourList = new List<Lookup<int, int>>();
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个点,但它应该有用。