如何按 T1 和 T3 升序对列表<元组>进行排序

本文关键字:T3 T1 排序 T2 列表 何按 升序 元组 | 更新日期: 2023-09-27 18:33:53

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

var datalist= new List<Tuple<long, string, string>>();
  • first:按第一个元组(长)升序排序
  • 如果有具有相同数字(长)的条目,则按字母升序按最后一个元组(最后一个字符串)排序

可能的排序输出:

  • 123123, xxx, zz
  • 444555, YBC, AA
  • 444555,ABC,BB

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

datalist.Sort((x, y) => x.Item1.CompareTo(y.Item1));

如何按 T1 和 T3 升序对列表<元组<T1、T2、T3>>进行排序

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

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

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

datalist = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3).ToList();

当然,该费用的成本会随着datalist的大小以及此操作的完成频率而增加。

另一方面,如果您只打算枚举一次,那么省略ToList()会降低此成本,因为不会创建新列表,并且如果您的枚举可能会在整个周期之前退出(例如,在找到一些满足给定条件的项目之后),那么它甚至可能比第一种方法更有效。

x => yx => { return y; }的缩写。

然后可以修改正文以包含您喜欢的任何内容,而不是单个 return 语句。

datalist.Sort(
    (x, y) => {
      var result = x.Item1.CompareTo(y.Item1);
      if (result == 0)
        result = x.Item3.CompareTo(y.Item3);
      return result;
    });

使用OrderByThenBy组合:

var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3);
<</div> div class="answers">

你可以使用 Linq 来解决它。首先添加命名空间:

using System.Linq;

然后使用 OrderByThenBy 作为示例:

var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3);

如果需要按descending顺序排序,还可以查看OrderByDescendingTheByDescending

您可以调用Orderby和您需要的许多TheBy。

您可以使用

System.LinqOrderBy()ThenBy()函数。

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
    public static void Main()
    {
        var datalist= new List<Tuple<long, string, string>>();
        datalist.Add(new Tuple<long, string, string>(123123, "xxx", "zz"));
        datalist.Add(new Tuple<long, string, string>(444555, "ybc", "bb"));
        datalist.Add(new Tuple<long, string, string>(444555, "abc", "aa"));
        datalist = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3).ToList();
        foreach(var data in datalist)
        {
            Console.WriteLine("{0} {1} {2}", data.Item1,data.Item2, data.Item3);
        }
    }
}

https://dotnetfiddle.net/LNYCjA