如何复制C#中的3D不规则数组?

4

我需要(最初)复制一个C# 3D 锯齿数组,foos,到另一个3D数组(最终加上x、y、z维度)。我认为我可以使用与构建foos相同的语法/逻辑来复制foos,就像我下面所做的一样(其中row = 2, col = 3, z = 4):

private static void copyFooArray(Foo[][][] foos, ref Foo[][][] newArray)
{
    for (int row = 0; row < foos.Length; row++)
    {
        newArray[row] = new Foo[foos[row].Length][];

        for (int col = 0; col < foos[row].Length; col++)
        {
            newArray[row][col] = new Foo[foos[row][col].Length];

            for (int z= 0; z< foos[row][col].Length; z++)
            {
                newArray[row][col][z] = new Foo();
                newArray[row][col][z].member = foos[row][col][z].member;
            }
        }
    }            
        Console.Read();
}

但是我在这行代码上遇到了 Index was outside the bounds of the array. 的错误:

newArray[row] = new Foo[foos[row].Length][];

为什么会出现这种情况呢?

Foo 类:

public class Foo
{ 
    public string member;
}

感谢您的选择。

除了作为参数传递的数组newArray的大小不足以容纳foos.Length,即其长度小于foos.Length之外,还有什么原因会导致该错误呢? - user2819245
看起来你忘记正确初始化newArray了。方法的第一行应该是类似这样的:newArray = new Foo[foos.Length][][]; - Timur Mannapov
你如何初始化 newArray?也许一个 List<List<List<Foo>>> 更加合适。 - Steve
当你在撰写答案时,@TimurMannapov 发表了评论。我同意你的评论。我猜这取决于他想何时初始化它。 - Cory
我应该提到我正在初始化newArray数组: Foo[][][] newArray = new Foo[0][][]; 然后将其传递给我的copyFooArray(...)函数... 看起来我的问题可能已经在下面得到了解答... - Mark S
"最终要添加x、y、z维度"这是行不通的——在.NET中,数组长度是固定的。" - Steve
2个回答

3

看起来你引用的数组没有被正确初始化。为了设置值,你的新数组必须初始化为与原始数组相同的大小。

为了使其工作,你需要传入类似这样的内容:

Foo[][][] firstFoo = new Foo[10][][];
Foo[][][] fooToCopy = new Foo[firstFoo.Length][][];

copyFooArray(firstFoo, ref fooToCopy);

此外,由于在c#中数组是通过引用传递的,所以ref关键字是不必要的。

没错 - 就是这样:Foo[][][] newArray = new Foo[fooArray.Length][][];同时成功移除了 ref 关键字。 非常感谢。 - Mark S

1
除了接受答案中提出的修复方法,这里还有一种更快的方法:
   public static int[][][] Copy(int[][][] source)
    {
        int[][][] dest = new int[source.Length][][];
        for (int x = 0; x < source.Length; x++)
        {
            int[][] s = new int[source[x].Length][];
            for (int y = 0; y < source[x].Length; y++)
            {
                int[] n = new int[source[x][y].Length];
                int length = source[x][y].Length * sizeof(int);
                Buffer.BlockCopy(source[x][y], 0, n, 0, length);
                s[y] = n;
            }
            dest[x] = s;
        }
        return dest;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接