c#元组列表多种排序

时间:2014-06-02 09:55:43

标签: c# list sorting

我有一个三维元组数组:

var CountList = new List<Tuple<int, int, int>>();

所需的排序在第一个int上以数字方式递增,然后在第二个int上以数字方式递减,因此

5, 4, 7
4, 5, 6
5, 2, 3
3, 5, 2
2, 4, 1
2, 6, 4

变为

2, 6 ,4
2, 4, 1
3, 5, 2
4, 5, 6
5, 4, 7
5, 2, 3

是否有为Lis​​t.Sort()指定其他搜索功能的方法,或者是否需要将信息拆分为单独的列表,对每个组执行降序排序,然后将单个列表项添加到“主”列表“按所需的升序排列?

4 个答案:

答案 0 :(得分:5)

您可以使用LINQ:

CountList = CountList
    .OrderBy(t => t.Item1)
    .ThenByDescending(t => t.Item2)
    .ToList();

使用List.Sort的不太容易理解但可能更有效的方式:

CountList.Sort(
(t1, t2) =>
{
    int res = t1.Item1.CompareTo(t2.Item1);
    return res != 0 ? res : t2.Item2.CompareTo(t1.Item2);
});

List.Sort对原始列表进行排序,而不是创建新列表。

答案 1 :(得分:0)

您可以使用Enumerable.OrderBy

使用Enumerable.ThenByDescendingLINQ
var Sorted = CountList.OrderBy(l=>l.Item1)
                      .ThenByDescending(l => l.Item2)
                      .ToList();

答案 2 :(得分:0)

Sort有一个带有Comparison参数的重载。

CountList.Sort((t1, t2) => {
        int c = t1.Item1.CompareTo(t2.Item1);
        if (c != 0) return c;
        c = t1.Item2.CompareTo(t2.Item2);
        return -c;
    }
);

答案 3 :(得分:0)

您可以使用

List<Tuple<int, int, int>> Sorted
  = CountList.OrderBy( iTuple => iTuple.Item1 )
             .ThenByDescending( iTuple => iTuple.Item2 )
             .ToList();

或实施自定义比较器以获取lexicographical ordering