【问题标题】:OrderBy to sort a 2D array in .NET C#OrderBy 在 .NET C# 中对二维数组进行排序
【发布时间】:2017-12-04 22:28:09
【问题描述】:

这段代码有什么问题?

我正在使用System.Linq

int[,] array = new int[3, 3] { { 1, 4, 2 },
                               { 4, 5, 1 },
                               { 7, 3, 8 } 
                             };

int[,] sortedByFirst = array.OrderBy(x => x[0]);
int[,] sortedBySecond = array.OrderBy(x => x[1]);
int[,] sortedByThird = array.OrderBy(x => x[2]);

错误:

您是否缺少 using 指令或程序集引用?

【问题讨论】:

  • 确保您使用的是System.Linq命名空间
  • Array 实现了非泛型IEnumerable,因此您需要将其转换为IEnumerable<T> 以使用OrderedBy
  • @GeorgeAlexandria 这不起作用,因为IEnumerable 返回所有int 值而不是子数组。而且您不能只转换为IEnumerable<T>,而必须使用Cast<int>()
  • @juharr 是的,我知道它会返回所有元素,但这并不能最终解决他的问题。它只会帮助他解决编译错误。

标签: c# arrays linq sorting


【解决方案1】:

2D 数组不适用于 LINQ。您期望OrderBy 接收和排序什么,即使它是在 n 维数组上实现的?

使用List 会更好。

var src = new List<int[]> { new[] { 1, 4, 2 },
                  new[] { 4, 5, 1 },
                  new[] { 7, 3, 8 } 
                };

var sortedByFirst = src.OrderBy(x => x[0]).ToList();
var sortedBySecond = src.OrderBy(x => x[1]).ToList();
var sortedByThird = src.OrderBy(x => x[2]).ToList();

【讨论】:

    【解决方案2】:

    二维数组不适用于 OrderBy。随意尝试:

     for (int i = 0; i < array.Length - 1; ++i)
                        {
                            for (int j = i; j < array.GetLength(0); ++j)
                            {
                               // for first column
    
                               int a = array[i,0]; // this way you can choose column whatever you want
                                int b = array[j,0];
    
                                if (a < b) 
                                {
    
                                    for (int x = 0; x < array.GetLength(1); ++x)
                                    {
                                        string temp = array[i, x];
                                        array[i, x] = array[j, x];
                                        array[j, x] = temp;
                                    }
                                }
    
                            }
                        }
    

    【讨论】:

      【解决方案3】:

      对于您想要实现的目标存在歧义。当您按“列”之一排序时,您是否希望保持“网格行”彼此同步?或者您是否希望仅按顺序返回单个“列”中的值,与其他“列”分开?

      如果是第一个,那么我建议从另一个与此类似的问题中遵循 this 示例,并利用 DataTable 类来防止您的行混淆。

      如果是第二个,那么您可以通过array[0].OrderBy(x=&gt;x);订购该列

      顺便说一句,我认为你的代码......

              int[,] ordered = array.OrderBy(x => x[0]).ToArray();
      

      ...您希望使用 int[][] 类型数组,而不是 int[,] 类型数组。 OrderBy 存在于另一个,但它并没有达到你所期望的,我不认为。我刚刚尝试过,我什至无法弄清楚它在做什么。

      希望这会有所帮助!

      【讨论】:

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