【发布时间】:2022-12-07 19:42:31
【问题描述】:
我在 C# 中遇到了一个奇怪的行为。我创建了一个 int[][] 数组,如下所示:
int[][] m_dist = Enumerable.Repeat(Enumerable.Repeat(-1, m.Length).ToArray(), m.Length).ToArray();
数组看起来像这样:
-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,
后来,当我试图修改单个数组元素时,我被惊呆了,因为不仅更改了一个项目,而且更改了一个完整的 int[] 数组:
m_dist[1][1] = 0;
输出是:
-1,0,-1,-1,-1,-1,
-1,0,-1,-1,-1,-1,
-1,0,-1,-1,-1,-1,
-1,0,-1,-1,-1,-1,
-1,0,-1,-1,-1,-1,
-1,0,-1,-1,-1,-1,
我怀疑在创建数组的过程中发生了一些事情,因此我将其简化为:
//int[][] m_dist = Enumerable.Repeat(Enumerable.Repeat(-1, m.Length).ToArray(), m.Length).ToArray();
int[][] m_dist = new int[m.Length][];
for (int i = 0; i < m_dist.Length; i++)
{
m_dist[i] = new int[m.Length];
for (int j = 0; j < m_dist[i].Length; j++)
{
m_dist[i][j] = -1;
}
}
通过这种初始化,寻址是完美的。
当然我可以接受这个解决方案,但我想了解我第一次尝试时发生了什么。
如果有人可以解释那会很棒!
调试代码:
int[][] m_dist = Enumerable.Repeat(Enumerable.Repeat(-1, m.Length).ToArray(), m.Length).ToArray();
for (int i = 0; i < m_dist.Length; i++)
{
for (int j = 0; j < m_dist[i].Length; j++)
{
Console.Write(m_dist[i][j] + ",");
}
Console.Write("\n");
}
Console.WriteLine();
m_dist[1][1] = 0;
for ( int i = 0; i< m_dist.Length; i++ )
{
for (int j = 0; j < m_dist[i].Length; j++)
{
Console.Write(m_dist[i][j] + ",");
}
Console.Write("\n");
}
Console.WriteLine();
当然我可以接受这个解决方案,但我想了解我第一次尝试时发生了什么。如果有人能解释一下那就太好了!
【问题讨论】:
-
显然是因为它多次是数组的同一个实例......你的代码基本上是
int[] a = new [] {.... }......然后是int[][] aa = new [][] { a, a, a, a, a, a } -
@Selvin 对你来说“很明显”,但对 OP 来说显然不是那么明显。 :D
标签: c# arrays multidimensional-array indexing initialization