我进行了测试一下 测试代码如下
1 List<List<int>> list = new List<List<int>>(); 2 List<int> list1 = new List<int>(); 3 4 for ( int i=0; i < 3; i++) 5 { 6 list1.Add(i); 7 } 8 list.Add(list1); 9 Console.WriteLine($"list1 {list1[0]},{list1[1]},{list1[2]}"); 10 Console.WriteLine($"list {list[0][0]},{list[0][1]},{list[0][2]}"); 11 list1.Clear(); 12 for (int i=3; i < 6; i++) 13 { 14 list1.Add(i); 15 } 16 list.Add(list1); 17 Console.WriteLine($"list1 {list1[0]},{list1[1]},{list1[2]}"); 18 Console.WriteLine($"list {list[0][0]},{list[0][1]},{list[0][2]}"); 19 Console.WriteLine($"list {list[1][0]},{list[1][1]},{list[1][2]}"); 20 Console.Read();
我进行了调试,结果发现你起的名字动态,确实是动态的list只是绑定了list1的地址,并没有将list1的数据复制到list中去,只是记录的地址,当你清空list1的时候你会发现list也被清空了,当你对list1进行再次添加值后,进行输出时,他会找到list[0]中存的list1的地址,当输出list[1]时也是在内存中找到list1的地址,由于是一个地址,所以输出的数据是一样的。
知道了原理之后进行修改就容易了, 进行如下的修改就好了
List<List<int>> list = new List<List<int>>(); List<int> list1 = new List<int>(); for ( int i=0; i < 3; i++) { list1.Add(i); } //在add时进行一个转化,让编译器在内存中开辟另一块额外的空间 list.Add(list1.ToArray().ToList()); Console.WriteLine($"list1 {list1[0]},{list1[1]},{list1[2]}"); Console.WriteLine($"list {list[0][0]},{list[0][1]},{list[0][2]}"); list1.Clear(); for (int i=3; i < 6; i++) { list1.Add(i); } //这里也一样 list.Add(list1.ToArray().ToList()); Console.WriteLine($"list1 {list1[0]},{list1[1]},{list1[2]}"); Console.WriteLine($"list {list[0][0]},{list[0][1]},{list[0][2]}"); Console.WriteLine($"list {list[1][0]},{list[1][1]},{list[1][2]}"); Console.Read();
输出结果截图
非常感谢
@MRGan: 要学会F10和F11
@你好世界_qu: 那动态二位数组arr[5][动态一维数组]怎么定义与赋值呢;(二维数组为固定值,一维为动态数组的值。)
@MRGan: 请告诉我你想实现什么效果
@MRGan: Ilist<List<int>> list =new List<List<int>> (5);
@你好世界_qu: 我等会先试试
@你好世界_qu: 想把"动态一维数组"放入指定的动态二维数组arr[3][]中,或者arr[5][]中
List<List<T>>
我想得到正确的运算结果:
array[0][]: 1 2 3
array[1][]: 10 11 12
上图运行结果,array[1][]覆盖了array[0][]的值;这是什么原因
@MRGan: 看一下我的回答,应该是你想要的答案
何为动态二维数组?