有两个索引的有序队列

时间:2009-12-20 13:29:54

标签: c# data-structures queue

我需要一个有序队列,其中对象将按主要和次要值排序。

class Object
{
  int PrimaryValue;
  int SecondaryValue;
}

队列中Object的位置必须由PrimaryValue确定。具有较高PrimaryValue的对象必须位于具有较低PrimaryValue的对象之前。但是,对于具有相同PrimaryValue的两个对象,必须使用SecondaryValue来确定优先级。此外,我需要两个函数来获得迭代器GetFirst()和向后迭代器GetLast(),它们将返回相应的迭代器。

4 个答案:

答案 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 ...

http://msdn.microsoft.com/en-us/library/ms132323.aspx