【问题标题】:How to initialize multi-dimensional array with different default value如何用不同的默认值初始化多维数组
【发布时间】:2013-02-11 07:40:04
【问题描述】:

我正在尝试使用 -1 初始化整数值的二维数组。当我创建一个新数组时,它会自动填充为 0。 我知道我可以用 2 个循环来完成它,但我想在构建数组时应该有某种方法可以做到这一点(所以我不必经历两次),这样就可以代替 0,提供值将被插入。可能吗? 如果不是在数组的初始构建期间,是否有其他时间或代码节省方式,或者我是否坚持使用 2 个循环?

【问题讨论】:

  • 这些数组有多大?
  • 数组大小取决于创建它的函数的输入,我忘了提及。直接初始化是不可能的。

标签: c# .net arrays multidimensional-array default-value


【解决方案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 个外部数组进行一次循环,但复制操作将比循环更快。

    【讨论】:

    • 我确实在使用多维数组。好吧,我想那时我将不得不走“老派”的道路。
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2014-11-30
    相关资源
    最近更新 更多