如何使用元组的第一个元素作为排序值,对 List<Tuple<int, int>>
进行降序排序? 排序必须是就地进行的,我只知道如何使用 LINQ 进行排序,但那会返回一个新的列表。
你只需要提供一个 IComparer<Tuple<int, int>>
或者一个 Comparison<Tuple<int, int>>
给List<T>.Sort
方法即可。后者可能更容易内联指定:
list.Sort((x, y) => y.Item1.CompareTo(x.Item1));
如果你想按第一个值排序,然后再按第二个值排序,那就有点棘手了,但仍然可行。例如:
list.Sort((x, y) => {
int result = y.Item1.CompareTo(x.Item1);
return result == 0 ? y.Item2.CompareTo(x.Item2) : result;
});
编辑:现在我已经修改了上面的内容,使其按降序排序。请注意,正确的方法是反转比较顺序(从y
到x
而不是从x
到y
)。您不能只取反CompareTo
的返回值-当CompareTo
返回int.MinValue
时,这将失败。
List<Tuple<int, int>> list = ...
list = list.OrderBy(i => i.Item1).ToList();
是的,它创建了一个新的列表,但我只是感兴趣——为什么你不喜欢这样做?
List<Tuple<int, int>> list = new List<Tuple<int, int>>
{
new Tuple<int,int>(1,1),
new Tuple<int,int>(0,2),
new Tuple<int,int>(3,0)
};
list.Sort(Comparer<Tuple<int, int>>.Default);
产生:
0,2
1,1
3,0
它是原地修改的,对吗?
Tuple<T1, T2>
是否有文档说明按 Item1
然后按 Item2
排序? - Jon Skeetlist = list.OrderByDescending(x => x.Item1).ToList();
您是否查看过List<T>.Sort
方法?您可以使用接受Comparison<T>
委托或IComparer<T>
的重载:
list.Sort((x,y)=> x.Item1.CompareTo(y.Item1));
var listSort = from element in list orderby element.Item1 element.Item2 select element;
我需要按照X值对IntPoints列表进行排序。通过修改之前的示例,我成功地完成了这个任务。为了方便以后有需要的人,我将在此处放置我的示例。
//Where edges is an unsorted list of edgepoints returned from the C# A.Forge Library
List<IntPoint> edges
//Sorting on the X value of the Intpoint and returning a new List
List<IntPoint> edgesSorted = (from point in edges orderby point.X select point).ToList();
using System;
using System.Collections.Generic;
namespace SortTuples
{
class Program
{
static void Main(string[] args)
{
var data = new List<(string Name, int Grade)>()
{
("Patrick", 89),
("Lucia", 92),
("Veronika", 72),
("Robert", 78),
("Maria", 65),
("Andrea", 51),
("Ondrej", 45)
};
data.Sort((s1, s2) => s1.Name.CompareTo(s2.Name));
Console.WriteLine(string.Join(", ", data));
data.Sort((s1, s2) => s2.Grade.CompareTo(s1.Grade));
Console.WriteLine(string.Join(", ", data));
}
}
}
输出:
$ dotnet run
(Andrea, 51), (Lucia, 92), (Maria, 65), (Ondrej, 45), (Patrick, 89), (Robert, 78), (Veronika, 72)
(Lucia, 92), (Patrick, 89), (Robert, 78), (Veronika, 72), (Maria, 65), (Andrea, 51), (Ondrej, 45)
(x, y)
同时取2个项目吗?因此,当第一个查找开始时,它正在获取list[0]
和list[1]
?另外:ascending order
注释已被注释,但未得到回答。它是否与顺序有关,例如(x, y)或(y, x)
与随后的代码? - C4d(x, y)
是 lambda 表达式的参数列表;lambda 表达式的主体将x
与y
进行比较。通过编辑答案使代码按降序排序,回答了该注释。 - Jon Skeet