gpt4 book ai didi

c# - 如何在不复制的情况下在 C# 中将一维数组的大小调整为二维数组?

转载 作者:太空狗 更新时间:2023-10-29 19:46:25 25 4
gpt4 key购买 nike

据我所知,二维数组在内存中的布局与一维数组完全一样,只是使用了不同的索引。因此,假设您希望将一维数组中的元素转换为二维数组以行优先的方式。我确实弄清楚了如何使用单个复制命令来完成此操作,但它似乎仍然比必要的处理更多:

int[] onedim = new int[] { 5, 3, 6, 2, 1, 5 };
int[,] twodim = new int[2, 3];
GCHandle pinnedArray = GCHandle.Alloc(twodim, GCHandleType.Pinned);
IntPtr pointer = pinnedArray.AddrOfPinnedObject();
Marshal.Copy(onedim, 0, pointer, onedim.Length);
pinnedArray.Free();

有什么方法可以让 C# 将此一维数组视为具有这些维度的二维数组吗?不安全的代码很好。如果不是,这是语言的限制还是我遗漏了一些基本问题?

最佳答案

一种方法是定义一个访问底层一维数组的类

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 在保持一维数组引用的同时表现得像一个二维数组。

编辑:索引是倒退的,修复了它。

关于c# - 如何在不复制的情况下在 C# 中将一维数组的大小调整为二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com