【问题标题】:How to sort a 2d array in c#?如何在 C# 中对二维数组进行排序?
【发布时间】:2021-11-07 14:37:35
【问题描述】:

假设我有一个二维数组

{{7,2},{2,4},{2,1},{4,9},{4,2},{3,4},{3,2},{3,1}}

我想根据第一个元素,然后是第二个元素,然后是第三个元素对数组进行排序,依此类推。对于给定的输入,我想要这样的输出

{{2,1},{2,4},{3,1},{3,2},{3,4},{4,2},{4,9},{7,2}}

我试过下面的代码sn-p:

Comparer<int> comparer = Comparer<int>.Default;
Array.Sort<int[]>(properties, (x, y) => comparer.Compare(x[0], y[0]));

但这并没有给我想要的输出。

【问题讨论】:

    标签: c# arrays sorting multidimensional-array


    【解决方案1】:

    Array.Sort 不幸的是仅适用于一维数组。 LINQ 的 OrderBy 也无济于事,至少不能直接提供帮助,因为二维数组没有实现 IEnumerable&lt;T&gt;。 因此,将数据复制到一些易于分类的容器中似乎是可行的方法。 然后 .e.g List&lt;T&gt;.SortEnumerable.OrderBy 就可以完成这项工作。

    这是一个例子:

            //init 2d-array
            int[,] arr2d = { { 7, 2 }, { 2, 4 }, { 2, 1 }, { 4, 9 }, { 4, 2 }, { 3, 4 }, { 3, 2 }, { 3, 1 } };
    
            //copy to List of valuetuples(int, int) to have a sortable enumerable
            var tmp = new List<(int a, int b)>();
            for (var i = 0; i < arr2d.GetLength(0); i++) {
               tmp.Add((arr2d[i,0], arr2d[i,1])); 
            }
            //setup our sorting callback aka Comparison delegate
            Comparison<(int a, int b)> sorter = (t1, t2) => {
                                                    var res1 = t1.a - t2.a;
                                                    return res1 != 0 ? res1 : t1.b - t2.b;
                                                 };
            //do sort
            tmp.Sort(sorter);
            //copy back to an 2d array that now is sorted as desired
            var sortedArr2d = new int[arr2d.GetLength(0), arr2d.GetLength(1)];
            for (var i = 0; i < tmp.Count; i++) {
                sortedArr2d[i, 0] = tmp[i].a;
                sortedArr2d[i, 1] = tmp[i].b;
            }
            //show output (on console for demo)
            for (var i = 0; i < arr2d.GetLength(0); i++) {
               Console.WriteLine("[{0}, {1}]", sortedArr2d[i, 0], sortedArr2d[i, 1]);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-17
      • 2015-01-30
      • 2012-12-15
      • 2018-05-14
      • 2019-06-08
      • 1970-01-01
      • 2014-08-10
      相关资源
      最近更新 更多