Упорядоченная очередь с двумя индексами - PullRequest
1 голос
/ 20 декабря 2009

Мне нужна упорядоченная очередь, где объекты будут упорядочены по первичному и вторичному значению.

class Object
{
  int PrimaryValue;
  int SecondaryValue;
}

Положение объекта в очереди должно определяться PrimaryValue. Объект с более высоким PrimaryValue должен предшествовать объекту с более низким PrimaryValue. Однако для двух объектов с одинаковым PrimaryValue для определения приоритета необходимо использовать SecondaryValue. Также мне нужны две функции для получения прямого итератора GetFirst() и обратного итератора GetLast(), который бы возвращал соответствующие итераторы.

Ответы [ 4 ]

7 голосов
/ 20 декабря 2009
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()) ....

2 голосов
/ 20 декабря 2009

Похоже, что вы хотите, это или PriorityQueue с приоритетом пары, или просто SortedList с пользовательским Comparer. Вот реализация PriorityQueue , которая может быть адаптирована к вашим потребностям. Так как GetEnumerator () возвращает IEnumerable, вы можете использовать метод расширения Reverse () , чтобы перебирать его от начала до конца.

Аналогично с SortedList - вам нужно только предоставить подходящий IComparer, который выполняет необходимое сравнение, и использовать Reverse () для итерации «назад к фронту».

1 голос
/ 20 декабря 2009

Вы можете просто использовать 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);
}
}
0 голосов
/ 20 декабря 2009

вам просто нужен SortedList .... и подарить себе копара ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...