如何用不同的默认值初始化多维数组
Posted
技术标签:
【中文标题】如何用不同的默认值初始化多维数组【英文标题】:How to initialize multi-dimensional array with different default value 【发布时间】:2013-02-11 07:40:04 【问题描述】:我正在尝试使用 -1 初始化整数值的二维数组。当我创建一个新数组时,它会自动填充为 0。 我知道我可以用 2 个循环来完成它,但我想在构建数组时应该有某种方法可以做到这一点(所以我不必经历两次),这样就可以代替 0,提供值将被插入。可能吗? 如果不是在数组的初始构建期间,是否有其他时间或代码节省方式,或者我是否坚持使用 2 个循环?
【问题讨论】:
这些数组有多大? 数组大小取决于创建它的函数的输入,我忘了提及。直接初始化是不可能的。 【参考方案1】:在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);
这样就可以了。
【讨论】:
【参考方案2】:试试这样的:int[,] array2D = new int[,] -1 , -1 , -1 , -1 ;
或带有维度int[,] array2D = new int[4,2] -1,-1 , -1,-1 , -1,-1 , -1,-1 ;
【讨论】:
不确定为什么 -1 - 这对于小型二维数组完全有效,并且在这种情况下是最佳选择。来自我的 +1...(不过,如果数组很大,这将很快停止维护) 我也一样,我忘了提到原始问题中的重要细节。 没关系,@ReedCopsey 很好地回答了你的问题,我猜【参考方案3】:对于多维数组,循环很可能是最好的方法,除非数组小到可以直接在代码中初始化。
如果您使用jagged array,您可以初始化第一个子数组,然后使用Array.Copy 将这些值复制到彼此的子数组中。这仍然需要对第一个子数组进行一次迭代,然后对 N-1 个外部数组进行一次循环,但复制操作将比循环更快。
【讨论】:
我确实在使用多维数组。好吧,我想那时我将不得不走“老派”的道路。以上是关于如何用不同的默认值初始化多维数组的主要内容,如果未能解决你的问题,请参考以下文章