排序列表<Tuple <int,int >>就地

Bob*_*rbo 29 c# sorting list

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

Jon*_*eet 51

你只需要提供一个IComparer<Tuple<int, int>>或一Comparison<Tuple<int, int>>List<T>.Sort方法.后者可能更容易指定内联:

list.Sort((x, y) => y.Item1.CompareTo(x.Item1));
Run Code Online (Sandbox Code Playgroud)

如果你想按第一个值和第二个值排序,它会变得有点棘手,但仍然可行.例如:

list.Sort((x, y) => {
    int result = y.Item1.CompareTo(x.Item1);
    return result == 0 ? y.Item2.CompareTo(x.Item2) : result;
});
Run Code Online (Sandbox Code Playgroud)

编辑:我现在修改了上面的内容,按降序排序.请注意,要做到这一点,正确的方法是反向的比较顺序(yx代替xy).你不能只是否定返回值CompareTo- 这将在CompareTo返回时失败int.MinValue.

  • 根据参考,元组具有默认的比较器,该比较器先按Item1再对Item2进行比较。http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,189 (2认同)
  • @C4ud3x:`(x, y)` 是 lambda 表达式的参数列表;lambda 表达式的主体将 `x` 与 `y` 进行比较。注释 *is* 已回答,通过编辑答案使代码按降序排序。 (2认同)

aba*_*hev 12

为什么不呢?

List<Tuple<int, int>> list = ...
list = list.OrderBy(i => i.Item1).ToList();
Run Code Online (Sandbox Code Playgroud)

是的,它创建了一个新列表,但我只是感兴趣 - 为什么你不喜欢这个?


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);
Run Code Online (Sandbox Code Playgroud)

生产:

0,2
1,1
3,0
Run Code Online (Sandbox Code Playgroud)

它是就地的,不是吗?

  • “Tuple&lt;T1, T2&gt;” **记录** 是否按“Item1”排序,然后按“Item2”排序? (2认同)
  • @abatishchev:通过示例中的注释似乎有些脆弱。我想我宁愿使用自己的比较器,也不愿依赖只有这种保证水平的东西。不过只是MHO。 (2认同)

小智 7

现在你可以使用 lambda 来做到这一点:

list = list.OrderByDescending(x => x.Item1).ToList();
Run Code Online (Sandbox Code Playgroud)