我有
SortedList<string, object> testIds = new SortedList<string, object>();
我把它按降序排列。 我用于排序下一个结构:
testIds.ToList().Sort(delegate(KeyValuePair<string, object>x, KeyValuePair<string, object>y)
{
return x.Key.CompareTo(y.Key)*-1;
});
但它没有帮助我。你能给我一些建议如何解决这个问题吗?
答案 0 :(得分:8)
虽然SortedList<K,V>
默认按升序排序,但它提供了一个构造函数,该构造函数采用自定义IComparer<K>
,可让您将订单切换为您需要的任何内容。
实施IComparer<string>
,反转常规比较的结果,并将其提供给SortedList<K,V>
的构造函数:
class ReverseComparer : IComparer<string> {
public int Compare(string x, string y) {
return -x.CompareTo(y);
}
}
var testIds = new SortedList<string,object>(new ReverseComparer());
您可以在一行中编写相同的内容,而无需为其创建命名类:
var testIds = new SortedList<string,object>(
// Note how the negation is replaced with reversing the order of comparison
Comparer<string>.Create((x, y) => y.CompareTo(x))
);
答案 1 :(得分:3)
正如dasblinkenlight所指出的那样,你应该使用带有IComparer<T>
的构造函数重载。
但是,如果这是一次性事情,那么最好使用Comparer<T>.Create
,而不是为此创建一个全新的类。
var comparer = Comparer<string>.Create((x, y) => y.CompareTo(x));
var testIds = new SortedList<string,object>(comparer);
此外,在按相反顺序比较项目时,惯例是将y
与x
进行比较,而不是将x
与y
进行比较并反转结果。
答案 2 :(得分:0)
只需使用Reverse。假设你有一个有序列表OrigOrderedList,那么
SortedList<string, object> testIds = OrigOrderedList.Reverse() // should do the work
static void Main(string[] args)
{
SortedList<string, object> test1 = new SortedList<string, object>();
test1.Add("a", "A");
test1.Add("b", "B");
test1.Add("c", "C");
Console.WriteLine(String.Join(", ", test1.Select(x => x.Key)));
Console.WriteLine(String.Join(", ", test1.Reverse().Select(x => x.Key)));
}