C # .NET: Нисходящее сравнение SortedDictionary? - PullRequest
1 голос
/ 24 апреля 2010

Я хочу IDictionary<float, foo>, который сначала возвращает значения ключа ключа.

private IDictionary<float, foo> layers = new SortedDictionary<float, foo>(new DescendingComparer<float>());

class DescendingComparer<T> : IComparer<T> where T : IComparable<T>
{
    public int Compare(T x, T y)
    {
        return -y.CompareTo(x);
    }
}

Однако, это возвращает значения в порядке наименьшего первого. Я чувствую, что совершаю глупую ошибку здесь.

Чтобы посмотреть, что произойдет, я удалил знак - из компаратора:

    public int Compare(T x, T y)
    {
        return y.CompareTo(x);
    }

Но я получил тот же результат. Это укрепляет мою интуицию, что я делаю глупую ошибку.

Это код, который обращается к словарю:

foreach (KeyValuePair<float, foo> kv in sortedLayers)
{
    // ...
}

ОБНОВЛЕНИЕ: Это работает, но слишком медленно, чтобы вызывать так часто, как мне нужно вызвать этот метод:

IOrderedEnumerable<KeyValuePair<float, foo>> sortedLayers = layers.OrderByDescending(kv => kv.Key);
foreach (KeyValuePair<float, ICollection<IGameObjectController>> kv in sortedLayers) { 
    // ...
}

ОБНОВЛЕНИЕ: Я установил точку останова в компараторе, которая никогда не попадет, когда я добавляю и удаляю пары kv из словаря. Что бы это могло значить?

Ответы [ 3 ]

3 голосов
/ 24 апреля 2010

Для убывающего порядка (сначала самые большие значения) вы должны сделать -x.CompareTo(y)

0 голосов
/ 24 апреля 2010

В этой строке переключите x и y:

return -y.CompareTo(x);

Сделать это

return -x.CompareTo(y);
0 голосов
/ 24 апреля 2010

попробуй:

public int Compare(T x, T y)
{
    return x.CompareTo(y);
}
...