【问题标题】:C# .NET: Descending comparison of a SortedDictionary?C# .NET:SortedDictionary 的降序比较?
【发布时间】: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


【解决方案1】:

对于降序(最大值在前),您可以使用-x.CompareTo(y)

【讨论】:

  • @Rosarch:它肯定可以工作,我知道我以前用过。如果你调试你的代码,你是否发现你的 Compare 方法实际上被调用了?
  • 看起来不是,实际上。我是否错误地创建了SortedDictionary
  • @Rosarch:不,您正在正确地创建字典。检查以确保您在添加/删除元素和枚举时使用稍后在代码中构建的相同字典。 IE。查找对layers 的所有引用,并确保没有另一段代码分配不同的SortedDictionary
  • 否定可能是个坏主意。如果int 是可能的最大负值-2147483648,那么它的否定是相同的数字-2147483648。因此,最好交换xy,如y.CompareTo(x),而不是在前面加上减号,如-x.CompareTo(y)。如果您不知道比较对象之一是否为null,您可以使用Comparer&lt;T&gt;.Default.Compare(y, x)
【解决方案2】:

尝试:

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

【讨论】:

    【解决方案3】:

    在这一行,切换x和y:

    return -y.CompareTo(x);
    

    做起来

    return -x.CompareTo(y);
    

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多