1

我想要一个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 对时,该断点永远不会被击中。这意味着什么?

4

3 回答 3

3

对于降序(最大值在前),你会做-x.CompareTo(y)

于 2010-04-23T22:36:41.300 回答
0

在这一行中,切换 x 和 y:

return -y.CompareTo(x);

做了

return -x.CompareTo(y);
于 2010-04-23T23:59:08.467 回答
0

尝试:

public int Compare(T x, T y)
{
    return x.CompareTo(y);
}
于 2010-04-23T22:35:34.377 回答