我如何按降序排序,List<Tuple<int, int>>
使用元组的第一个元素作为确定顺序的值?它必须是就地的,我只知道如何使用LINQ返回一个新的列表。
答案 0 :(得分:46)
您只需向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
时,这将失败。
答案 1 :(得分:12)
为什么不呢?
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
它就位,不是吗?
答案 2 :(得分:4)
你看过List<T>.Sort
方法了吗?您可以使用需要Comparison<T>
代表或IComparer<T>
:
list.Sort((x,y)=> x.Item1.CompareTo(y.Item1));
答案 3 :(得分:4)
var listSort = from element in list orderby element.Item1 element.Item2 select element;
答案 4 :(得分:1)
现在您可以使用lambda来做到这一点:
// vue.config.js
module.exports = {
parallel: false,
chainWebpack: (config) => {
config.module
.rule('worker')
.test(/\.worker\.js$/)
.use('worker-loader')
.loader('worker-loader')
.end();
}
};
答案 5 :(得分:0)
我需要对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();
答案 6 :(得分:0)
这是C#7中添加的具有现代元组类型的示例。
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)