【发布时间】:2011-02-11 17:46:38
【问题描述】:
我想要一个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 对时,该断点永远不会被击中。这意味着什么?
【问题讨论】:
-
我认为您将升序与降序混淆了。升序为 1 2 3 4 5(最小值在前),降序为 5 4 3 2 1(最大值在前)。
-
y.CompareTo(x)应该适用于降序。为什么不呢? :o 如果你提供少量样本和输出,它会更容易知道。见reverse-sorted-dictionary-in-net
标签: c# .net sorting comparable