List<int[]> LST = new List<int[]>();
int[] ARY = new int[2];
Random RND = new Random();
for( int i = 0 ; i < 2 ; i++ )
{
ARY[0] = RND.Next( 100, 999 );
ARY[1] = RND.Next( 100, 999 );
LST.Add( ARY );
MessageBox.Show(
LST.Count.ToString() + "\n" +
LST[i][0].ToString() + ", " +
LST[i][1].ToString());
}
foreach ( var x in LST )
MessageBox.Show(
x[0].ToString() + " ," +
x[1].ToString() );
嗨..专家!!
我想要;
Foo, Boo
Poo, Voo
但是,我得到了;
Poo, Voo
Poo, Voo
在中间点检查时,两者看起来都很好。 但是,在最后阶段,我得到了扁平的List(最后一个重复)。 任何好的解释? 问候 (是的,我发现如果我在一个for循环中移动ARY声明,结果会很好。我想有原因为什么..)
答案 0 :(得分:4)
您正在创建一次数组,然后您正在更改其内容并将其多次添加到列表中。
请注意,List
可以有两个指向同一对象的项目。这就是你的情况。 LST
列表有两个指向同一个数组的项目。
你可以通过在循环中移动这一行来解决这个问题:
int[] ARY = new int[2];
在中间点检查时,消息框将显示您刚刚设置的数组的当前值。
要清楚地看到这一点,请在调用LST[0]
之前检查循环第二次迭代中MessageBox.Show...
的值。它将显示新值,而不是旧值。
或者甚至更好,在第二次迭代中,在执行LST[0]
之后但在执行ARY[0] = RND.Next( 100, 999 );
之前检查ARY[1] = RND.Next( 100, 999 );
的值。
答案 1 :(得分:1)
考虑到你永远不会重新初始化数组,因此会一次又一次地覆盖内存中相同的两个位置。跟踪程序,你应该很容易看到。