如何按 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));
在第一个结果等价的情况下,您只需进行第二次比较:
datalist.Sort((x, y) => {
var cmp = x.Item1.CompareTo(y.Item1);
return cmp == 0 ? x.Item3.CompareTo(y.Item3) : cmp;
});
或者,您可以使用OrderBy
后跟ThenBy
和ToList
将它们再次放入列表中;当您已经有一个列表并且不会将原始顺序用于其他内容时,这是相当浪费的,但它更具表现力:
datalist = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3).ToList();
当然,该费用的成本会随着datalist
的大小以及此操作的完成频率而增加。
另一方面,如果您只打算枚举一次,那么省略ToList()
会降低此成本,因为不会创建新列表,并且如果您的枚举可能会在整个周期之前退出(例如,在找到一些满足给定条件的项目之后),那么它甚至可能比第一种方法更有效。
x => y
是x => { 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;
});
使用OrderBy
和ThenBy
组合:
var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3);
<</div>
div class="answers"> 你可以使用 Linq 来解决它。首先添加命名空间:
using System.Linq;
然后使用 OrderBy
和 ThenBy
作为示例:
var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3);
如果需要按descending
顺序排序,还可以查看OrderByDescending
和TheByDescending
。
您可以调用Orderby和您需要的许多TheBy。
您可以使用
System.Linq
的OrderBy()
和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