我们都知道以前字典迭代中是不支持动态修改的【否则会报错::“Collection was modified; enumeration operation may not execute.”--
集合已修改 无法进行操作】 但.Net 5将支持字典迭代中的动态修改 详情见下
- 首先创建一个Dictionary 并尝试迭代中进行修改
var dict = new Dictionary<int, int>()
{
[1001] = 1,
[1002] = 10,
[1003] = 20
};
foreach (var userid in dict.Keys)
{
dict[userid] = dict[userid] + 1;
}
.Net 5之前
- 通过ILSpy我们查看一下源码
- 首先创建Dictionary 并插入数据 注意 _version 这个变量 这将是判断集合是否可迭代中修改的关键
- 接着继续查看源码 进入迭代
- 迭代中 尝试修改字典
- 综上可以发现 .Net 5之前 迭代中不能修改字典 是因为当尝试修改字典时 会调用字典的索引器操作 造成 _version++ 从而在 .MoveNext()时判断出错 抛异常
- 首先创建Dictionary 并插入数据 注意 _version 这个变量 这将是判断集合是否可迭代中修改的关键
.Net 5
- .Net 5中是支持这种修改的 区别就在于上述操作的第二步 见图
- 操作字典-version保持不变 因此不会出现异常 代码正常运行 实现了迭代中修改字典的操作