Csharp/C#教程:矩阵到数组c#分享


矩阵到数组c#

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

1 2 3 4 5 6 7 8 9 

 [1 2 3 4 5 6 7 8 9] 

在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]); } } 

你最好总是在一次点击中分配完整的结果数组,然后复制数据。

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

 var size = arrays.Sum(a=> a.Length); var result = new int[size]; 

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

 var cursor = 0; foreach(var a in arrays) { a.CopyTo(result, cursor); cursor += a.Length; } 

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

LINQ让这件事变得微不足道。

 int[,] array2d = ...; var array1d = array2d.Cast().ToArray(); 

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

 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]; } } 

甚至:

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

正如杰夫所说,LINQ让这件事变得微不足道。 OfType<>()通常应该比Cast<>快一点:

 array1D = array2D.OfType().ToArray(); 

然而,正如@phoog所提到的,OfType OfType<>的实现仍然会受到装箱/拆箱处罚的影响。

只是为了它的乐趣,如果你想要一个快速的基于LINQ的解决方案(避免拳击成本),你可以使用这个小扩展方法:

 static class LinqEx { public static IEnumerable Flatten(this T[,] matrix) { foreach (var item in matrix) yield return item; } } 

或者,根据杰夫的第二个解决方案:

  public static IEnumerable Flatten(this T[,] matrix) { var rows = matrix.GetLength(0); var cols = matrix.GetLength(1); for (var i = 0; i < rows;i++ ) { for (var j = 0; j < cols; j++ ) yield return matrix[i, j]; } } 

用法:

  int[,] array2D = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int[] array1D = array2D.Flatten().ToArray(); 

我没有完全了解这一点,但我希望这会比基于LINQ / IEnumerable的内置选项获得更好的性能。 然而杰夫的第二个解决方案似乎总是禁食。

使用Buffer.BlockCopy的替代解决方案:

上述就是C#学习教程:矩阵到数组c#分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!

 int[,] array2D = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int[] array1D = new int[ array2D.Length ]; Buffer.BlockCopy(array2D, 0, array1D, 0, array1D.Length * sizeof(int)); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/988259.html

(0)
上一篇 2021年12月23日
下一篇 2021年12月23日

精彩推荐