矩阵到数组c#

cMi*_*nor 3 c# arrays matrix

这将是转换平方矩阵的最有效方法

  1 2 3 
  4 5 6
  7 8 9 
Run Code Online (Sandbox Code Playgroud)

[1 2 3 4 5 6 7 8 9]
Run Code Online (Sandbox Code Playgroud)

在c#中

我在做

int[,] array2D = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int[] array1D = new int[9];
int ci=0;

 for (int i = 0; i < 3; i++)
 {
      for (int j = 0; j < 3; j++)
      {
            array1D[ci++] = array2D[i, j]);
      }
 }
Run Code Online (Sandbox Code Playgroud)

Jef*_*ado 7

LINQ使这个变得微不足道.

int[,] array2d = ...;
var array1d = array2d.Cast<int>().ToArray();
Run Code Online (Sandbox Code Playgroud)

否则,你的方式是充足的,但可以推广:

int[,] array2d = ...;
var rows = array2d.GetLength(0);
var cols = array2d.GetLength(1);
var array1d = new int[rows * cols];
var current = 0;
for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        array1d[current++] = array2d[i, j];
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至:

int[,] array2d = ...;
var array1d = new int[array2d.GetLength(0) * array2d.GetLength(1)];
var current = 0;
foreach (var value in array2d)
{
    array1d[current++] = value;
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来第二个实际上是最快的,第三个在~120ms内非常接近.第一个版本的速度比我测试中最快的55倍慢.转换10x10矩阵的一百万次迭代.`time ms(ticks)`:`27349ms(75675449)`,`491ms(1359839)`,`614ms(1700921)`. (2认同)

Ste*_*per 0

您最好一次性分配完整的结果数组,然后将数据复制进去。

你应该找到这样的总大小;

var size = arrays.Sum(a=> a.Length);
var result = new int[size];
Run Code Online (Sandbox Code Playgroud)

然后使用 Array.CopyTo 复制数组,而不是自己循环;

var cursor = 0;
foreach(var a in arrays) {
   a.CopyTo(result, cursor);
   cursor += a.Length;    
}
Run Code Online (Sandbox Code Playgroud)

Array.CopyTo 将比您自己的循环更快;至少,不慢。它可能会在内部使用C 的 memcpy函数来执行低级块复制。这已经是你能达到的最高效率了。