我制作了一个阵列列表,但效果不佳

时间:2016-01-15 00:24:32

标签: c# list

        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声明,结果会很好。我想有原因为什么..)

2 个答案:

答案 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)

考虑到你永远不会重新初始化数组,因此会一次又一次地覆盖内存中相同的两个位置。跟踪程序,你应该很容易看到。