You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:55:26