【发布时间】:2011-02-16 14:19:50
【问题描述】:
我有一个SortedDictionary,定义如下:
SortedDictionary<TPriority, Queue<TValue>> dict;
但我想以相反的顺序维护字典。我假设我需要设置Comparer,但是对于通用TPriority,我应该使用什么比较器?请注意,TPriority 实现了IComparable。
【问题讨论】:
标签: c#
我有一个SortedDictionary,定义如下:
SortedDictionary<TPriority, Queue<TValue>> dict;
但我想以相反的顺序维护字典。我假设我需要设置Comparer,但是对于通用TPriority,我应该使用什么比较器?请注意,TPriority 实现了IComparable。
【问题讨论】:
标签: c#
你可以很容易地创建一个反向比较器:
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<T>.Default?
sealed、readonly 和空合并运算符。
NullArgumentException 检查井等等。
如果你可以使用 LINQ,你可以这样做:
dict.Keys.Reverse();
这会以相反的顺序生成集合的键。
编辑:SortedDictionary 类在构造时被分配了一个IComparer<T>,这在事后无法更改。但是,您可以从原来的SortedDictionary<T> 创建一个新的:
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 ) );
【讨论】:
我最终只是将它添加到我的课程中,因为它是最短和最简单的:
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());
【讨论】: