C#更改数组中的维数
本文关键字:数组 | 更新日期: 2023-09-27 18:27:40
在C#中,是否可以将多维数组转换为1D数组,而不必将所有元素从一个复制到另一个,比如:
int[,] x = new int[3,4];
int[] y = (int[])x;
这将允许使用x,就好像它是一个12元素的1D数组一样(并从函数中返回),但编译器不允许这种转换。
据我所知,2D阵列(或更高数量的维度)被布置在连续的内存中,所以它似乎不可能以某种方式工作。使用unsafe
和fixed
可以允许通过指针进行访问,但这无助于将数组返回为1D。
虽然我相信在我目前正在处理的情况下,我可以一直使用1D数组,但如果这个函数是返回多维数组的东西和需要1D数组的东西之间的适配器的一部分,那将是有用的。
你不能,在C#中不可能用这种方式转换数组。您可以使用外部dll(C/C++)来完成此操作,但您需要将数组保持在固定位置。
速度
一般来说,我建议避免使用2D数组,因为它们在C#中速度较慢,最好使用锯齿状数组,甚至更好的一维数组。
Int32[] myArray = new Int32[xSize * ySize];
// Access
myArray[x + (y * xSize)] = 5;
在C#中,数组不能动态调整大小。一种方法是使用System.Collections.ArrayList而不是本机数组。另一个(更快的)解决方案是重新分配具有不同大小的阵列,并将旧阵列的内容复制到新阵列。通用函数resizeArray(如下)可以用于执行此操作。
这里有一个例子:
// Reallocates an array with a new size, and copies the contents
// of the old array to the new array.
// Arguments:
// oldArray the old array, to be reallocated.
// newSize the new array size.
// Returns A new array with the same contents.
public static System.Array ResizeArray (System.Array oldArray, int newSize) {
int oldSize = oldArray.Length;
System.Type elementType = oldArray.GetType().GetElementType();
System.Array newArray = System.Array.CreateInstance(elementType,newSize);
int preserveLength = System.Math.Min(oldSize,newSize);
if (preserveLength > 0)
System.Array.Copy (oldArray,newArray,preserveLength);
return newArray; }
您已经可以像迭代一维数组一样迭代多维:
int[,] data = { { 1, 2, 3 }, { 3, 4, 5 } };
foreach (int i in data)
... // i := 1 .. 5
您可以将一个一维数组封装在一个类中,并提供一个索引器属性this[int x1, int x2]
。
但其他一切都需要不安全的代码或复制。两者都将是低效的。
根据Felix K.的回答,引用了一位开发人员的话:
你不能在不丢失信息的情况下将正方形转换为直线
尝试
int[,] x = {{1, 2}, {2, 2}};
int[] y = new int[4];
System.Buffer.BlockCopy(x, 0, y, 0, 4);
不能强制转换,必须复制元素:
int[] y = (from int i in y select i).ToArray();