C#.NET:排序词典的降序比较?

C#.NET:排序词典的降序比较?,c#,.net,sorting,comparable,C#,.net,Sorting,Comparable,我想要一个IDictionary,它首先返回键的最大值 private IDictionary<float, foo> layers = new SortedDictionary<float, foo>(new DescendingComparer<float>()); class DescendingComparer<T> : IComparer<T> where T : IComparable<T> { pub

我想要一个
IDictionary
,它首先返回键的最大值

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);
    }
}
但我得到了同样的结果。这强化了我的直觉,我正在犯一个愚蠢的错误

这是访问字典的代码:

foreach (KeyValuePair<float, foo> kv in sortedLayers)
{
    // ...
}
foreach(分类层中的键值对kv)
{
// ...
}
更新:此方法有效,但速度太慢,无法像我需要调用此方法那样频繁调用:

IOrderedEnumerable<KeyValuePair<float, foo>> sortedLayers = layers.OrderByDescending(kv => kv.Key);
foreach (KeyValuePair<float, ICollection<IGameObjectController>> kv in sortedLayers) { 
    // ...
}
IOrderedEnumerable sortedLayers=layers.OrderByDescending(kv=>kv.Key);
foreach(分类图层中的键值对kv){
// ...
}
更新:我在比较器中设置了一个断点,当我从字典中添加和删除kv对时,该断点永远不会被击中。这意味着什么?

试试:

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

对于降序(首先是最大值),您将执行
-x.CompareTo(y)

在此行中,切换x和y:

return -y.CompareTo(x);
成功

return -x.CompareTo(y);

我认为你把上升和下降混淆了。升序为12345(先是最小值),降序为54321(先是最大值)。
y.CompareTo(x)
应按降序排列。为什么不呢o如果您只提供少量样本和输出,则更容易了解。请看@Rosarch:它肯定会有用的,我知道我以前用过它。如果调试代码,您是否发现实际上调用了Compare方法?看起来实际上没有。我是否创建的
SortedDictionary
不正确?@Rosarch:不,您创建的词典是正确的。在添加/删除元素和枚举时,请检查以确保您使用的字典与稍后在代码中构建的字典相同。也就是说,找到对
层的所有引用
,并确保没有另一段代码分配不同的
SortedDictionary
。否定可能是个坏主意。如果
int
是可能的最大负值,
-2147483648
,则该值的反方向是相同的数字,
-2147483648
。因此,最好交换
x
y
,如
y.CompareTo(x)
,而不是预先加上负号,如
-x.CompareTo(y)
。如果您不知道其中一个比较符是否为
null
,则可以使用
Comparer.Default.Compare(y,x)
return -x.CompareTo(y);