如何按T1和T3升序对List <Tuple <T1,T2,T3 >>进行排序

Str*_*uct 0 .net c# sorting tuples list

我想通过T1和T3升序对以下三元组列表进行排序:

var datalist= new List<Tuple<long, string, string>>();
Run Code Online (Sandbox Code Playgroud)
  • 第一种:按第一元组(长)递增排序
  • 如果有相同数字(长)的条目,则按字母顺序按最后一个元组(最后一个字符串)进行排序

可能的排序输出:

  • 123123,xxx,zz
  • 444555,ybc,aa
  • 444555,abc,bb

使用此代码,a可以按第一个元组(长整数)排序​​列表,但不能按最后一个元组(最后一个字符串)排序:

datalist.Sort((x, y) => x.Item1.CompareTo(y.Item1));
Run Code Online (Sandbox Code Playgroud)

Jon*_*nna 5

在第一个结果是等效的情况下,您只需要进行第二次比较:

datalist.Sort((x, y) => {
    var cmp = x.Item1.CompareTo(y.Item1);
    return cmp == 0 ? x.Item3.CompareTo(y.Item3) : cmp;
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用OrderBy后跟ThenByToList将它们再次放入列表中; 当你已经有一个列表并且不会将原始订单用于别的东西时,这是相当浪费的,但它更具有表现力:

datalist = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3).ToList();
Run Code Online (Sandbox Code Playgroud)

当然,这笔费用的成本随着datalist这项行动的规模和频率而上升.

另一方面,如果你只是要枚举这一次,那么省略ToList()减少这个成本因为没有创建新列表,并且如果你的枚举可能在整个周期之前退出(例如在找到满足一个项目的项目之后)给定标准)那么它甚至可能比第一种方法更有效.