C#按多列对多维数组进行排序

Posted

技术标签:

【中文标题】C#按多列对多维数组进行排序【英文标题】:C# sorting multidimensional array by multiple columns 【发布时间】:2015-06-28 09:03:48 【问题描述】:

我有一个具有以下值的多维数组:

multiarray = new int[,]      8, 63  ,
                              4, 2   , 
                              0, -55 , 
                              8, 57  , 
                              2, -120, 
                              8, 53    ;

我需要做的是按第一列对数组进行排序,然后在值相等的地方按第二列排序。

理想的输出应该是这样的:

8, 63
8, 57
8, 53
4, 2
2, -120
0, -55

最好的方法是什么?

【问题讨论】:

How do I sort a two-dimensional array in C#? 的可能重复项 @AlexShesterov 这个问题似乎只包括一次按一列排序,我需要一次按两列排序。 如果要使用原始int数组,请编写自定义排序程序! en.wikipedia.org/wiki/Sorting_algorithm。这是学校作业 【参考方案1】:

在 Linq 中使用 List 对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication19

    class Program
    
        static void Main(string[] args)
        
            List<List<int>> multiarray = new List<List<int>>    
                new List<int>  8, 63  ,
                new List<int>   4, 2   , 
                new List<int>   0, -55 , 
                new List<int>   8, 57  , 
                new List<int>   2, -120, 
                new List<int>   8, 53    
            ;
           

            List<List<int>> sortedList = multiarray.OrderBy(x => x[1]).OrderBy(y => y[0]).ToList();

        
    

【讨论】:

【参考方案2】:
using System.IO;
using System;
using System.Linq;

class Program

    static void Main()
    
        // declare and initialize a JAGGED array
         int[][] a=new int[][]   new int[]  8, 63  ,
                            new int[]   4, 2   , 
                            new int[]   0, -55 , 
                             new int[]  8, 53  , 
                             new int[]  2, -120, 
                             new int[]  8, 57    ;

      //using LAMBDA expression
      Array.Sort(a, (a1, a2) =>  return (a2[0]-a1[0])+((a2[0]-a1[0])==0?(a2[1]-a1[1]):0); 
      );

       Console.WriteLine("LAMBDA Sorting");   
      for(int i=0;i<6;i++)
         Console.WriteLine(" 0:1 ",a[i][0],a[i][1]);

      //using LINQ   
      var sorted = from x in a
             orderby x[0] descending ,x[1]  descending
             select x;

       Console.WriteLine("LINQ Sorting");      
       foreach(var item in sorted )
        Console.WriteLine(" 0:1 ",item[0], item[1]);
    

【讨论】:

【参考方案3】:

不使用 Linq,按范围列索引排序(FromIndex ... ToIndex):

    public class MyListArrComparer : IComparer<Int32[]>

    public Int32 FromIndex get; set;
    public Int32 ToIndex get; set;
    public int Compare(Int32[] x, Int32[] y)
    
      for (Int32 index=FromIndex; index<=ToIndex; index++) 
          if (x[index]>y[index]) return -1;
          if (x[index]<y[index]) return 1;
      
      return 0;
    

您可以添加第三个 ASC / DESC 参数或列列表而不是范围。

使用示例:

MyListArrComparer comps = new MyListArrComparer();
comps.FromIndex=0;
comps.ToIndex=3;
hhList.Sort(comps);

问候 WJ(AK)

【讨论】:

以上是关于C#按多列对多维数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中按升序对多维数组进行排序? [复制]

按子项的值对多维数组进行排序

如何按列对多维数组进行排序?

如何按值对多维数组进行排序

php 按特定键对多维数组进行排序

PHP 按属性对多维数组进行排序和查询