据我所知,二维数组在内存中的布局与一维数组完全相同,只是使用不同的索引。所以考虑到这一点,似乎在C#中必须有某种方式(可能是不安全的)将1-D数组转换为2-D数组而不实际复制元素,假设您希望将1-D数组中的元素转换为第一行中的二维数组。我确实弄清楚如何使用单个复制命令完成此操作,但它似乎仍然需要更多处理:
{{1}}
我是否有某种方法可以告诉C#,将这个1-D阵列视为具有这些尺寸的2-D阵列?不安全的代码很好。如果没有,这是语言的限制还是我缺少一些基本问题?
答案 0 :(得分:2)
一种方法是定义一个访问底层1D数组的类
public class Array2D<T>
{
private readonly T[] _data;
private readonly Int32 _dimX;
private readonly Int32 _dimY;
public Array2D(T[] data, Int32 dimX, Int32 dimY)
{
_data = data;
_dimX = dimX;
_dimY = dimY;
}
public T this [Int32 x, Int32 y]
{
get { return _data[x * _dimY + y]; }
set { _data[x * _dimY + y] = value; }
}
}
var array = new[] { 1, 2, 3, 4, 5, 6 };
var array2d = new Array2D<Int32>(array, 2, 3);
Assert.AreEqual(array2d[0, 0], array[0]);
Assert.AreEqual(array2d[0, 1], array[1]);
Assert.AreEqual(array2d[0, 2], array[2]);
Assert.AreEqual(array2d[1, 0], array[3]);
Assert.AreEqual(array2d[1, 1], array[4]);
Assert.AreEqual(array2d[1, 2], array[5]);
我的索引可能是向后的,但是这个wold在保持1D数组引用的同时表现得像2D数组。
编辑:索引是向后的,修复它。
答案 1 :(得分:0)
答案 2 :(得分:-1)
如果没有在结构中包装2d数组,我无法弄清楚如何做到这一点,但以下工作没有副本。
struct array2d
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
int[,] data;
};
static void Main(string[] args)
{
int[] onedim = new int[] { 5, 3, 6, 2, 1, 5 };
array2d twoDim;
unsafe
{
fixed (int* p = onedim)
{
twoDim = Marshal.PtrToStructure<array2d>(new IntPtr(p));
}
}
}