顺序回溯法数独求解器字典域更新异常问题求助
问题根源
你遇到的核心问题是引用类型复用导致所有字典条目共享同一个列表实例:
- 在C#中,
List<int>属于引用类型,你创建单个options列表后,将它添加给字典的所有键,这意味着字典里每个FlexPosition对应的都是同一个列表的内存引用。 - 所以无论你修改哪个位置的域,本质都是在操作同一个列表,最终导致所有位置的域同步变化。
修复方案
给字典添加每个位置的域时,为每个位置创建独立的List<int>实例,不要复用同一个options。修改你的foreach循环部分:
原代码:
List<int> options = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; foreach (var i in FlexPositions) { domains.Add(i, options); }
修改后:
foreach (var i in FlexPositions) { // 为每个位置创建全新的列表实例 domains.Add(i, new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); // 也可以通过复制现有列表实现:new List<int>(options) }
补充说明
- 引用类型与值类型的区别:值类型(如
int、结构体)赋值时会复制完整数据,而引用类型(如List、类)赋值仅复制内存地址,多个变量会指向同一个对象。你之前的问题正是因为复用了同一个引用,导致所有字典条目共享同一个列表。 - 额外注意:用
int[]作为字典键时,C#默认以引用相等判断键是否相同——只有两个数组是同一个实例时,才会被视为相同键。你当前代码使用FlexPositions中的数组实例,暂时不会有问题,但如果后续需要用新创建的数组作为键查找,可能需要自定义IEqualityComparer<int[]>来实现值相等比较。
内容的提问来源于stack exchange,提问作者Hendrik
相关产品推荐
相关产品推荐

