如何对List <tuple <t1,t2,=“”t3 =“”>&gt;进行排序由T1和T3上升</tuple <t1,>

时间:2014-12-11 10:08:11

标签: c# .net list sorting tuples

我想按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));

5 个答案:

答案 0 :(得分:5)

如果第一个结果是等效的话,你只需要进行第二次比较:

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

使用OrderByThenBy组合:

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

答案 3 :(得分:1)

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

using System.Linq;

然后使用OrderByThenBy作为示例:

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

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

您可以致电OrderBy以及您需要的许多TheBy。

答案 4 :(得分:1)

您可以使用OrderBy()的{​​{1}}和ThenBy()个功能。

System.Linq

https://dotnetfiddle.net/LNYCjA