我想要一个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对时,它永远不会被击中。这意味着什么?
答案 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);