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

14
我想初始化一个二维整数数组为-1。当我创建一个新数组时,它会自动填充为0。 我知道可以使用2个for循环来实现,但是我想象中应该有一种在构建数组时就能完成的方法(这样我就不必通过两次遍历来完成),以便插入提供的值而不是0。这可行吗? 如果不能在数组初始构建期间完成,是否有其他时间或代码节省的方法,或者我只能使用2个for循环?

3
这些数组有多大? - Reed Copsey
1
数组大小基于创建它的函数的输入,我忘了提到这一点。直接初始化是不可能的。 - kovike
3个回答

22
尝试像这样使用: int[,] array2D = new int[,] { { -1 }, { -1 }, { -1 }, { -1} }; 或者使用维度 int[,] array2D = new int[4,2] { { -1,-1 }, { -1,-1 }, { -1,-1 }, {-1,-1} };

5
不确定为什么会有-1的评分,对于小型的2D数组,这是完全有效的选择,也是最佳的选择。我赞成这个观点。(然而,如果数组很大,这种方法很快就无法维护了。) - Reed Copsey
同样的问题,我忘记在原始问题中提到重要的细节。 - kovike
没问题,@ReedCopsey 很好地回答了你的问题,我想。 - TravellingGeek

12
使用多维数组时,循环最可能是最好的方法,除非数组足够小可以直接在代码中初始化。
如果您正在使用jagged array,则可以初始化第一个子数组,然后使用Array.Copy将这些值复制到每个其他子数组中。这仍需要通过第一个子数组进行一次迭代,并循环遍历N-1个外部数组,但复制操作将比循环快。

我确实在使用多维数组。好吧,我想我只能老老实实地走“老派”的路线了。 - kovike

0
在Python中,这种2D数组的初始化是错误的:
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);

这样就可以了。


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