C#元组列表多重排序

4

我有一个三维元组数组:

var CountList = new List<Tuple<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

有没有办法为List.Sort()指定更多的搜索功能,还是我需要将信息拆分成单独的列表,在每个组上执行降序排序,然后按所需的升序顺序将单个列表项添加到“主列表”中?
4个回答

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

1
你可以使用。
List<Tuple<int, int, int>> Sorted
  = CountList.OrderBy( iTuple => iTuple.Item1 )
             .ThenByDescending( iTuple => iTuple.Item2 )
             .ToList();

或者实现一个自定义比较器来获得词典排序

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接