如何使用不同的默认值初始化多维数组

时间:2013-02-26 00:30:56

标签: c# .net arrays multidimensional-array default-value

我试图用-1初始化整数值的二维数组。当我创建一个新数组时,它会自动填充0。 我知道我可以用2进行循环,但我想在构建数组时应该有一些方法可以做到这一点(所以我不需要经历两次),所以提供而不是0,提供值将被插入。可能吗? 如果没有在阵列的初始构建期间,是否有其他时间或代码保存方式,或者我是否坚持使用2个循环?

2 个答案:

答案 0 :(得分:20)

尝试这样的事情:int[,] array2D = new int[,] { { -1 }, { -1 }, { -1 }, { -1} };

或尺寸int[,] array2D = new int[4,2] { { -1,-1 }, { -1,-1 }, { -1,-1 }, {-1,-1} };

答案 1 :(得分:0)

在 Python 中,这种二维数组初始化是错误的:

mat = [[0] * 5] * 5  # wrong
mat = [[0] * 5] for _ in range(5)]  # correct

因为你多次复制内部数组的引用,改变其中一个最终会改变所有。

mat[0][0] = 1
print(mat)
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0

在 C# 中,我们也有类似的问题。

var mat = Enumerable.Repeat(Enumerable.Repeat(0, 5).ToArray(), 5).ToArray();

由于数组是引用类型,所以外面的Repeat()实际上是在复制内部数组的引用。

如果您确实需要在不使用 for 循环的情况下创建和初始化多维数组,那么自定义帮助器类可能会有所帮助:

static class HelperFunctions
{
    public static T[][] Repeat<T>(this T[] arr, int count)
    {
        var res = new T[count][];
        for (int i = 0; i < count; i++)
        {
            //arr.CopyTo(res[i], 0);
            res[i] = (T[])arr.Clone();
        }
        return res;
    }
}

那么如果你想使用它:

using static HelperFunctions;

var mat = Enumerable.Repeat(0, 5).ToArray().Repeat(5);

这就行了。