【问题标题】:Reversed Sorted Dictionary?反向排序字典?
【发布时间】:2011-02-16 14:19:50
【问题描述】:

我有一个SortedDictionary,定义如下:

SortedDictionary<TPriority, Queue<TValue>> dict;

但我想以相反的顺序维护字典。我假设我需要设置Comparer,但是对于通用TPriority,我应该使用什么比较器?请注意,TPriority 实现了IComparable

【问题讨论】:

标签: c#


【解决方案1】:

你可以很容易地创建一个反向比较器:

public sealed class ReverseComparer<T> : IComparer<T> {
    private readonly IComparer<T> inner;
    public ReverseComparer() : this(null) { }
    public ReverseComparer(IComparer<T> inner) {
        this.inner = inner ?? Comparer<T>.Default;
    }
    int IComparer<T>.Compare(T x, T y) { return inner.Compare(y, x); }
}

现在将它传递给字典的构造函数:

var dict = new SortedDictionary<TPriority, Queue<TValue>>(
                 new ReverseComparer<TPriority>());

【讨论】:

  • 为什么要传递null 然后检查它,而你本来可以传递Comparer&lt;T&gt;.Default
  • 很好地使用sealedreadonly 和空合并运算符。
  • @Mark - 好吧,我本来可以的,但是我真的应该添加一个NullArgumentException 检查井等等。
  • 哦...如果他们明确地将空对象传递给 c'tor。那是有道理的。
  • @Mark 啊!我实际上在 vb.net 而不是 C# 中工作,并且不知道 optioanl 参数在 C# 中的 3.5 中是不可能的
【解决方案2】:

如果你可以使用 LINQ,你可以这样做:

dict.Keys.Reverse();

这会以相反的顺序生成集合的键。

编辑:SortedDictionary 类在构造时被分配了一个IComparer&lt;T&gt;,这在事后无法更改。但是,您可以从原来的SortedDictionary&lt;T&gt; 创建一个新的:

class ReverseComparer<T> : IComparer<T>  {
   private readonly m_InnerComparer = new Comparer<T>.Default;

   public ReverseComparer( IComparer<T> inner )   {
      m_InnerComparer = inner; }

   public int Compare( T first, T second )  {
       return -m_InnerComparer.Compare( first, second );  }
}

var reverseDict = new SortedDictionary<TPriority, Queue<TValue>>( dict, 
                          new ReverseComparer( Comparer<TPriority>.Default ) );

【讨论】:

  • 好吧,我不是说我想要逆序的键,我的意思是我想保持字典的逆序,这样当我迭代它时,它总是降序订购...
  • @Mark:也许你不应该说你想要逆序的键。您应该编辑您的问题,以确保它是明确的,以便将来搜索的人受益。
  • @Tom:我没有说我“想要相反顺序的密钥”。我说我想以相反的顺序对键进行排序,从而对字典进行排序。我说“键”是为了区分队列/TValues 的排序,但我理解混淆的来源。已修改。
【解决方案3】:

我最终只是将它添加到我的课程中,因为它是最短和最简单的:

private class ReverseComparer : IComparer<TPriority>
{
    public int Compare(TPriority x, TPriority y) { return y.CompareTo(x); }
}

然后像这样初始化dict

dict = new SortedDictionary<TPriority, Queue<TValue>>(new ReverseComparer());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 2021-01-21
    • 2011-05-06
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2013-05-01
    相关资源
    最近更新 更多