C#中List of Lists索引操作异常:修改元素波及全部元素
C# List<List> 批量修改异常的原因与解决
问题核心原因
你犯了C#引用类型的典型错误:你只创建了一个List<double>实例ttmp,然后把这个实例的引用重复添加了100次到D中。
C#里的List<T>是引用类型,变量存储的是对象在内存中的地址,而非对象本身。当调用D.Add(ttmp)时,并没有复制ttmp的内容,只是把指向同一个List对象的地址存到了D的不同索引位置。
所以第二个循环里,D[i][0] +=1实际上是对同一个List对象的第0个元素执行100次加1操作(最终该元素会变为100,而非你描述的1)。你看到的“所有元素变为1”可能是描述偏差,但核心问题是所有子列表本质是同一个对象。
为什么C++的vector版本能正常运行
C++的vector是值语义类型,执行push_back(ttmp)时,默认会调用复制构造函数,创建ttmp的副本添加到外层vector中。因此外层vector的每个元素都是独立的vector对象,修改其中一个不会影响其他。
修复代码
要解决这个问题,需要在每次循环中创建新的List<double>实例,而非复用同一个引用:
List<List<double>> D = new List<List<double>>(); for (int i = 0; i < 100; i++) { // 每次循环创建独立的List<double>实例 List<double> ttmp = new List<double>(new double[256]); D.Add(ttmp); } for (int i = 0; i < 100; i++) { D[i][0] = D[i][0] + 1; }
这样D中的每个子列表都是独立对象,修改D[i][0]只会影响对应索引的子列表,不会波及其他。
内容的提问来源于stack exchange,提问作者Gospadi
相关产品推荐
相关产品推荐

