按降序排序SortedList C#

时间:2014-06-19 12:01:34

标签: c# sorting collections

我有

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

但它没有帮助我。你能给我一些建议如何解决这个问题吗?

3 个答案:

答案 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);

此外,在按相反顺序比较项目时,惯例是将yx进行比较,而不是将xy进行比较并反转结果。

答案 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)));
    }