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