C#.NET:降序SortedDictionary的比较?

时间:2010-04-23 22:31:04

标签: c# .net sorting comparable

我想要一个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)
{
    // ...
}

UPDATE:这样可行,但调用此方法所需的频率太慢,无法调用:

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

UPDATE:我在比较器中设置了一个断点,当我从字典中添加和删除kv对时,它永远不会被击中。这意味着什么?

3 个答案:

答案 0 :(得分:3)

对于降序(最大值为第一个),您可以执行-x.CompareTo(y)

答案 1 :(得分:0)

尝试:

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

答案 2 :(得分:0)

在此行中,切换x和y:

return -y.CompareTo(x);

成功

return -x.CompareTo(y);