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());