【问题标题】:Efficient conversion of an array into a two-dimensional one using LINQ使用 LINQ 将数组高效转换为二维数组
【发布时间】:2010-09-20 21:59:55
【问题描述】:

我想在 C# 中以高效的方式执行以下操作,最好使用 LINQ。

Array[Length]Array[Length/Row][Row] 其中RowLength 是变量。

【问题讨论】:

  • 您能否举例说明您尝试转换的数据的外观?
  • LINQ-to-Objects 处理 IEnumerable,而不是直接处理数组。根本不支持二维数组。

标签: c# linq multidimensional-array


【解决方案1】:

您可以使用Buffer.BlockCopyblittable types的n维数组之间进行高效转换:

int[] a = new int[] { 1, 2, 3, 4, 5, 6 };

int rows = 2;
int columns = a.Length / rows;
int[,] b = new int[columns, rows];

Buffer.BlockCopy(a, 0, b, 0, sizeof(int) * a.Length);

// b[0, 0] == 1
// b[0, 1] == 2
// b[1, 0] == 3
// b[1, 1] == 4
// b[2, 0] == 5
// b[2, 1] == 6

这利用了多维(不是锯齿状!)数组由 CLR 在内存中连续布局的事实。

对于非 blittable 类型,只需使用一些好的 ol' for 循环。

【讨论】:

    【解决方案2】:

    那不是二维数组,那是锯齿状数组。我假设你的意思是Array[Length/Row,Row]

    在 LINQ 中没有任何东西可以做到这一点,所以如果你想使用它,你将会有一些开销。最高效的方式是直接代码:

    public T[,] MakeRows<T>(T[] values, int rowSize) {
      T[,] result = new T[values.Length / rowSize, rowSize];
      int row = 0, col = 0;
      foreach (T value in values) {
        resul[row, col] = value;
        if (++col == rowsize) {
          col = 0;
          row++;
        }
      }
      return result;
    }
    

    注意:该方法假定项目可均匀分成行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-18
      • 2018-02-19
      • 2019-01-23
      • 2015-12-02
      相关资源
      最近更新 更多