C# 反向排序词典?

C# 反向排序词典?,c#,C#,我有一个SortedDictionary,定义如下: SortedDictionary<TPriority, Queue<TValue>> dict; SortedDictionary dict; 但我想把这条命令保持在相反的顺序。我假设我需要设置比较器,但是对于泛型t优先级,我应该使用哪个比较器呢?请注意,t优先级实现了i可比较如果可以使用LINQ,您只需执行以下操作: dict.Keys.Reverse(); 这将按相反的顺序生成集合的键 编辑:SortedDi

我有一个
SortedDictionary
,定义如下:

SortedDictionary<TPriority, Queue<TValue>> dict;
SortedDictionary dict;

但我想把这条命令保持在相反的顺序。我假设我需要设置
比较器
,但是对于泛型
t优先级
,我应该使用哪个比较器呢?请注意,
t优先级
实现了
i可比较

如果可以使用LINQ,您只需执行以下操作:

dict.Keys.Reverse();
这将按相反的顺序生成集合的键

编辑:
SortedDictionary
类在构建时被分配了一个
IComparer
,并且在构建之后不能更改。但是,您可以从原始文档中创建新的
SortedDictionary

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 ) );
类反向比较程序:IComparer{
private readonly m_InnerComparer=新比较器。默认值;
公共反向比较程序(IComparer内部){
m_InnerComparer=内部;}
公共整数比较(T第一,T第二){
return-m_InnerComparer.Compare(第一,第二);}
}
var reverseDict=新分类词典(dict,
新的反向比较程序(Comparer.Default));

您可以非常轻松地创建反向比较器:

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); }
}
公共密封类反向比较者:IComparer{
私有只读IComparer内部;
public ReverseComparer():this(null){}
公共反向比较程序(IComparer内部){
this.inner=内部??比较器.Default;
}
int-IComparer.Compare(tx,ty){返回内部.Compare(y,x);}
}
现在将其传递到字典的构造函数中:

var dict = new SortedDictionary<TPriority, Queue<TValue>>(
                 new ReverseComparer<TPriority>());
var dict=new SortedDictionary(
新反向比较器());

我最后只是把它添加到我的类中,因为它是最短最简单的:

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

好吧,我不是说我想要的是相反顺序的键,我的意思是我想要以相反的顺序维护dict,这样当我迭代它时,它总是以降序排列…@马克:也许你不应该说你想要的是相反顺序的键。你应该编辑你的问题,以确保它是清楚的,以便将来搜索的人受益。@Tom:我没有说我“想要相反顺序的钥匙”。我说我想按相反的顺序对键进行排序,从而对dict进行排序。我说“键”是为了区别于对队列/t值进行排序,但我理解混淆的来源。修正。为什么要传递
null
,然后检查它,而你本来可以传递
比较器。默认的
?很好地使用了
密封的
只读的
和null合并操作符。@Mark-嗯,我可以,但是我真的应该添加
null参数异常
检查一口井,等等,哦。。。如果他们显式地将空对象传递给c'tor。那就有道理了。@Mark啊!实际上,我在vb.net中工作,而不是在C中工作,并且不知道optioanl参数在C中的3.5中是不可能的,可能是
dict = new SortedDictionary<TPriority, Queue<TValue>>(new ReverseComparer());