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