排序列表<tuple <int,int =“”>&gt;就地</元组<INT,>

时间:2011-01-12 11:59:58

标签: c# list sorting

我如何按降序排序,List<Tuple<int, int>>使用元组的第一个元素作为确定顺序的值?它必须是就地的,我只知道如何使用LINQ返回一个新的列表。

7 个答案:

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

编辑:我现在修改了上面的内容,按降序排序。请注意,执行此操作的正确方法是颠倒比较的顺序(yx而不是xy)。您必须否定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)