我想按T1和T3升序对以下三元组列表进行排序:
var datalist= new List<Tuple<long, string, string>>();
可能的排序输出:
使用此代码,a可以按第一个元组(长整数)排序列表,但不能按最后一个元组(最后一个字符串)排序:
datalist.Sort((x, y) => x.Item1.CompareTo(y.Item1));
答案 0 :(得分:5)
如果第一个结果是等效的话,你只需要进行第二次比较:
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()
会降低此费用,因为没有创建新列表,并且您的枚举可能会在完整之前退出循环(例如,在找到满足给定标准的一些项目之后),它甚至可能比第一种方法更有效。
答案 1 :(得分:3)
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;
});
答案 2 :(得分:2)
使用OrderBy
和ThenBy
组合:
var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3);
答案 3 :(得分:1)
您可以使用Linq来解决它。首先添加命名空间:
using System.Linq;
var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3);
如果您需要按descending
顺序排序,还可以看到OrderByDescending
和TheByDescending
。
您可以致电OrderBy以及您需要的许多TheBy。
答案 4 :(得分:1)