C#中二维List添加元素异常:所有子列表同步更新,求原因
问题描述
我编写了如下C#代码实现CountSort方法,期望将元素添加到二维List的指定索引子列表中,但实际运行时,所有子列表都会同步添加元素,而非仅目标子列表。
public static void CountSort(List<List<string>> arr) { for (int i = 0; i < arr.Count / 2; i++) arr[i][1] = "-"; List<List<string>> result = Enumerable.Repeat(new List<string>(), arr.Count).ToList(); for (int i = 0; i < arr.Count; i++) { string tempValue = arr[i][1]; int index = int.Parse(arr[i][0]); result[index].Add(tempValue); } }
实际输出示例:
List<List<string>("1"), List<string>("1"),List<string>("1")>
期望输出示例:
List<List<string>(), List<string>("1"), List<string>()>
问题原因
核心问题出在Enumerable.Repeat(new List<string>(), arr.Count)这行代码:
Enumerable.Repeat的逻辑是重复返回同一个对象的引用,而非每次生成新的实例。- 这就导致result列表里的所有子列表,本质上指向的是同一个
List<string>对象。不管你操作哪个索引的子列表,实际都是在修改同一个底层集合,所以所有子列表会同步显示新增元素。
修复方案
将result列表的初始化代码改成用Enumerable.Select生成每个独立的子列表,确保每个索引对应的都是全新的List<string>实例:
// 替换原result初始化代码 List<List<string>> result = Enumerable.Range(0, arr.Count) .Select(_ => new List<string>()) .ToList();
修改后,每个子列表都是独立对象,往指定索引的子列表添加元素时,其他子列表不会受影响,就能得到预期输出。
内容的提问来源于stack exchange,提问作者Stanislav Mozolevskiy
相关产品推荐
相关产品推荐

