【问题标题】:How to sort a List<Tuple<T1, T2, T3>> by T1 and T3 ascending如何按 T1 和 T3 升序对 List<Tuple<T1, T2, T3>> 进行排序
【发布时间】:2014-12-11 10:08:10
【问题描述】:

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

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

可能的排序输出:

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

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

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

【问题讨论】:

  • var sortedList = datalist.OrderBy(x =&gt; x.Item1).ThenBy(x =&gt; x.Item3).ToList()怎么样

标签: c# .net list sorting tuples


【解决方案1】:

你只需要在第一个结果相等的情况下进行第二个比较:

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() 会降低此成本,因为没有创建新列表,并且如果您的枚举可能在整个周期之前退出(例如,在找到一些满足给定标准的项目)然后它甚至可能比第一种方法更有效。

【讨论】:

    【解决方案2】:

    x =&gt; yx =&gt; { 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;
        });
    

    【讨论】:

      【解决方案3】:

      使用OrderByThenBy 组合:

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

      【讨论】:

      • 固定存储结果。
      【解决方案4】:

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

      using System.Linq;
      

      然后使用OrderByThenBy,作为示例:

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

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

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

      【讨论】:

        【解决方案5】:

        您可以使用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

        【讨论】:

          猜你喜欢
          • 2020-01-09
          • 2016-12-19
          • 1970-01-01
          • 2011-12-03
          • 2015-07-15
          • 1970-01-01
          • 2015-03-23
          • 1970-01-01
          • 2011-09-09
          相关资源
          最近更新 更多