C# 重塑数组 1->2 D 而不复制数据

C# reshape array 1->2 D without duplicating data

我使用的是相机制造商的 C# SDK。他们有一个方法:

CaptureImage(struct ExpSettings, ref ushort[] pixelbuffer)

我希望将一维数组像素缓冲区重塑为二维数组。 现在我正在使用 Buffer.BlockCopy 正如 Jon Skeet 在 SO 上的一个类似问题中所建议的那样。

但是我在想是否有一种方法(在 C# 中)无需复制实际数据即可执行此操作。在 C 中,我猜你可以使用联合。

你能以某种方式创建一个数组 UInt16[,] My2DImageData = new UInt[1000, 1000] 然后 "point the data array" 到上面的像素缓冲区吗?

感谢您的宝贵时间。 亲切的问候/亨里克

如果您只对通过索引器访问成员感兴趣并且不想复制数据,则可以使用包装器 class。

class ArrayWrapper<T>
{
    private readonly T[] _arr;
    private readonly int _w, _h;
    public ArrayWrapper(T[] arr, int w, int h)
    {
        if(arr == null)
            throw new ArgumentNullException("arr");

        if(arr.Length != w*h)
            throw new ArgumentException("Invalid array length", "arr");

        _arr = arr;
        _w = w;
        _h = h;
    }

    public T this[int i, int j]
    {
        get { return _arr[i*_w + j]; }
    }
}

var arr = new[] {
    0,  1,  2,  3, 
    4,  5,  6,  7, 
    8,  9,  10, 11, 
    12, 13, 14, 15 };
var wrapper = new ArrayWrapper<int>(arr, 4, 4);
Console.WriteLine(wrapper[1, 1]); // prints 5