矩阵到数组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