C#中Dictionary存储List时value自动同步更新问题如何解决
根因说明
- C#中
List<string>属于引用类型,代码全程复用了初始化时创建的同一个mylist实例,字典内所有键存储的value都指向该实例的内存地址,没有生成独立的列表副本 - 每次循环执行
Add操作修改的都是同一个列表对象,因此所有键对应的value都会同步更新
修复方案
每次循环时基于基础列表创建独立的新列表实例,再存入字典即可,修复后代码如下:
// 作为基础模板的列表,全程不做修改 var baseList = new List<string>() { "cucumber", "chilli", "tomato" }; var yourlist = new List<string>() { "apple", "mango", "banana" }; var dict = new Dictionary<string, List<string>>(); foreach (var i in yourlist) { // 每次循环创建独立的新列表副本,基于基础模板初始化 var currentList = new List<string>(baseList); currentList.Add(i); dict.Add(i, currentList); } // 输出验证 foreach(var d in dict.Keys) { Console.WriteLine($"键{d}对应的列表:"); foreach(var l in dict[d]) { Console.WriteLine(l); } }
也可以使用ToList()扩展方法生成副本,本质和上述写法一致,都是创建新的列表实例,避免引用复用导致的联动修改问题。
内容的提问来源于stack exchange,提问作者Nomaan Pansare
相关产品推荐
相关产品推荐

