不能将OrderBy用于int [,] - c#

时间:2017-09-05 16:04:55

标签: linq sorting multidimensional-array

我一直在尝试订购二维阵列并一直在努力,所以我想知道是否有人可以给我一些建议。

我有一个数据数组,我希望根据第一列中的值对所有行进行排序。即。

fruits = [
  {
    name: 'apple'
    quantity: 25
  },
  {
    name: 'banana',
    quantity: 25
  }
];

使用.OrderBy(x => x [0])时出错:

  

' INT []'不包含' OrderBy的定义,也没有扩展方法' OrderBy'

我包含Systems.Linq但仍然收到错误。

这是我的代码片段:

people = [
  {
    name: 'fred',
    fruits: [{ name: 'apple', quantity: 2 }, { name: 'banana', quantity: 3}]
  },
  {
    name: 'wilma',
    fruits: [{ name: 'apple', quantity: 1}, { name: 'banana', quantity: 0}]
  }
];

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案:

        int[,] x = new int[,]
             {  {360,0,0,1},
             {180,0,0,0},
             {0  ,0,1,0}};

        var list = new List<int[]>();
        for(int i = 0; i < x.GetLength(0); i++)
        {
            var row = new int[x.GetLength(1)];
            for(int j= 0; j < x.GetLength(1); j++)
            {
                row[j] = x[i, j];
            }
            list.Add(row);
        }
        var orderedList = list.OrderBy(r => r[0]).ToList();

当然,如果你需要一个数组作为结果,你必须从orderedList重建它。

注意:如果性能很重要,您可以用Buffer.BlockCopy(...)

替换内部循环
        var list = new List<int[]>();
        for(int i = 0; i < x.GetLength(0); i++)
        {
            var row = new int[x.GetLength(1)];
            Buffer.BlockCopy(x, i *4* x.GetLength(1),row,0, x.GetLength(1)*4);
            list.Add(row);
        }
        var orderedList = list.OrderBy(r => r[0]).ToList();

答案 1 :(得分:0)

如果你想用LINQ做,你可以这样做,但结果是List<int[]>。如果您需要将结果作为二维数组,则必须使用循环,然后根本不使用LINQ会更好。

var ans = Enumerable.Range(0, x.GetLength(0)).Select(r => Enumerable.Range(0, x.GetLength(1)).Select(c => x[r,c]).ToArray()).OrderBy(row => row[0]).ToList();