我需要一个有序队列,其中对象将按主要和次要值排序。
class Object
{
int PrimaryValue;
int SecondaryValue;
}
队列中Object的位置必须由PrimaryValue确定。具有较高PrimaryValue的对象必须位于具有较低PrimaryValue的对象之前。但是,对于具有相同PrimaryValue的两个对象,必须使用SecondaryValue来确定优先级。此外,我需要两个函数来获得迭代器GetFirst()
和向后迭代器GetLast()
,它们将返回相应的迭代器。
答案 0 :(得分:7)
class Obj : IComparable<Obj>
{
int PrimaryValue;
int SecondaryValue;
public int CompareTo(Obj other)
{
if (other == null) throw new ArgumentNullException("other");
int diff = PrimaryValue - other.PrimaryValue;
return diff != 0 ? diff : SecondaryValue - other.SecondaryValue;
}
}
我不太确定前向和反向迭代器是什么意思,这对于C#中不存在的概念来说是C ++术语。您始终可以使用foreach (var e in coll) ...
简单地在向前方向上迭代集合,反之则使用System.Linq:foreach (var e in coll.Reverse()) ...
。
答案 1 :(得分:2)
听起来你想要的是PriorityQueue,优先级是Pair,或者只是带有自定义Comparer的SortedList。这是PriorityQueue的实现,可以根据您的需求进行调整。由于GetEnumerator()返回一个IEnumerable,您可以使用Reverse()扩展方法从后到前迭代它。
与SortedList类似 - 您只需提供一个合适的IComparer来执行您需要的比较,并使用Reverse()进行前后迭代。
答案 2 :(得分:1)
您可以使用List<T>
,然后拨打Sort()
,然后在您的课程上实施IComparable<T>
。最后,如果您想要反向枚举,只需在Reverse()
上调用List<T>
。
public class MyObject : IComparable<MyObject>
{
public int First;
public int Second;
public int CompareTo(MyObject other)
{
if (Equals(this, other))
{
return 0;
}
if (ReferenceEquals(other, null))
{
return 1;
}
int first = this.First.CompareTo(other.First);
if (first != 0)
{
return first;
}
return this.Second.CompareTo(other.Second);
}
}
答案 3 :(得分:0)
你只需要一个SortedList .... 并给它你自己的copareing thingy ...