13

我正在尝试用-1初始化整数值的二维数组。当我创建一个新数组时,它会自动填充 0。我知道我可以用 2 来循环,但我想在构建数组时应该有一些方法(所以我不必通过它两次),以便插入提供的值而不是 0。可能吗?如果不是在阵列的初始构建期间,是否有其他时间或代码节省方式,或者我是否坚持使用 2 个周期?

4

3 回答 3

22

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

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

于 2013-02-26T00:36:37.590 回答
12

对于多维数组,循环很可能是最好的方法,除非数组小到可以直接在代码中初始化。

如果您使用的是锯齿状数组,则可以初始化第一个子数组,然后使用Array.Copy将这些值复制到彼此的子数组中。这仍然需要通过第一个子数组进行一次迭代,并通过 N-1 个外部数组进行一次循环,但复制操作将比循环更快。

于 2013-02-26T00:36:24.760 回答
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);

这会做。

于 2021-03-29T04:02:58.833 回答