修改字典值而不分配内存

3
我需要修改字典中的所有值。通常,在枚举字典时修改它会抛出异常。有各种方法可以解决这个问题,但我看到的所有答案都涉及分配临时存储空间。请参见在foreach循环中编辑字典值以获取示例。
我想修改所有值而不分配任何内存。编写一个自定义结构枚举器,忽略字典版本,这对于值来说是可以的,但由于字典的所有重要成员都是私有的,因此这似乎是不可能的。

1
您提供的链接似乎表明,在字典上调用Keys.ToList()并遍历该列表应该可以工作,不是吗? - Chris Berger
1
@IanMercer:虽然问题很不清晰。但我认为OP所指的异常是在迭代时修改集合引起的异常,而不是并发访问的问题。 - Matt Burland
我不确定为什么会被踩。有人能提出一个编辑建议,使问题更清晰吗? - Zachary Burns
1
如果这些值是类,你可以随心所欲地修改它们,而不需要修改字典本身。 - Jeroen Mostert
2
@ZacharyBurns:我没有点踩,但我认为如果你能添加一个小的代码示例来展示你正在尝试进行的迭代期间修改的类型,这将对很多人有所帮助。 - StriplingWarrior
显示剩余11条评论
1个回答

4

你肯定会涉及一些琐碎的性能优化。

根据您在评论中提供的额外信息,除了升级内存以处理更多分配之外,最好的方法(短期内)可能是使用字典源代码并创建一个专门用于此目的的新类,如果仅更改值,则不会递增version字段。


我很害怕得出那样的结论。出于许可证原因,您可能应该更新链接以指向 .Net Core 实现,而不是引用源代码。遵循一些规则,MIT 许可证可以允许修改,而 MS-RSL 许可证除了“引用”源代码之外几乎不允许任何事情。 - Zachary Burns
最终,这种方法非常有效。我最终得到了一个字典,您可以在迭代时替换值,甚至可以在迭代时删除键。 - Zachary Burns
我很高兴它可以正常工作。虽然在迭代期间删除键可能会导致跳过某些项目,但我不建议这样做,因为它们可能被放置在您要删除的桶中。 - StriplingWarrior
1
在这种情况下,在迭代时删除键是可以的。新类只允许您通过KeyValuePair替换值或删除键,确保您正在删除当前项。引用源字典迭代的工作方式是它不会迭代桶,而是简单地迭代条目数组。当删除一个项目时,它会从该数组中清零一个条目,然后从桶中修复链接列表,因此这不会成为问题。 - Zachary Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接