How to reshape an Array in c#

后端 未结 3 557
被撕碎了的回忆
被撕碎了的回忆 2020-12-06 02:19

I have a 3D array of bytes in c# which I have read from a bitmap:

byte[w, h, 3]

What is the easiest and more performance-friendly way of re

3条回答
  •  Happy的楠姐
    2020-12-06 02:45

    Buffer.BlockCopy will do it. At least, it works in this simple test.

    byte[, ,] src = new byte[10, 10, 3];
    byte[,] dest = new byte[100, 3];
    
    List srcList = new List();
    Random rnd = new Random();
    for (int i = 0; i < 10; ++i)
    {
        for (int j = 0; j < 10; ++j)
        {
            for (int k = 0; k < 3; ++k)
            {
                byte b = (byte)rnd.Next();
                src[i, j, k] = b;
                srcList.Add(b);
            }
        }
    }
    
    Buffer.BlockCopy(src, 0, dest, 0, 300);
    
    List destList = new List();
    for (int i = 0; i < 100; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            destList.Add(dest[i, j]);
        }
    }
    
    // See if they're in the same order
    for (int i = 0; i < srcList.Count; ++i)
    {
        Console.WriteLine("{0,3:N0} - {1,3:N0}", srcList[i], destList[i]);
        if (srcList[i] != destList[i])
        {
            Console.WriteLine("ERROR!");
        }
    }
    

    That said, I wouldn't use Buffer.BlockCopy in this way unless I was absolutely sure that there weren't odd cases with padding issues, etc. And although Buffer.BlockCopy is certainly faster than the equivalent explicit loop, it shouldn't materially affect the runtime of your program. Unless you're doing this conversion inside a piece of code that's called very, very often ... in which case you have bigger problems.

    I would suggest writing the explicit loop.

提交回复
热议问题