我需要一个相当专业的.NET系列,而且我认为BCL不能帮助我,但我想如果有人知道类似的话,我会把它扔出去。
基本上,我的要求是:
所以,我希望能够做的一些示例代码(正如我设想的那样可能会实现,其他适合上述的实现都可以):
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)
答案 0 :(得分:11)
我引用:
我需要一直排序这个列表。 我只对第一个感兴趣 列表中的值由。定义 任何时候排序算法。
这听起来像不想要排序队列而是Priority Queue。如果性能是个问题,那么PQ肯定会更快,O(log n)vs O(n)。但是重复丢弃问题需要您保持并行HashSet&lt;&gt;同样。
答案 1 :(得分:5)
您是否看过SortedDictionary或SortedList?
答案 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个点,但它应该有用。