c# - 在字典的值集合上应用函数

标签 c# .net

foreach (string key in dbFields.Keys)
     dbFields[key] = MySqlHelper.EscapeString(dbFields[key]);

我收到一个 InvalidOperationException 错误,声称集合已被修改。 为什么它认为 Keys 集合已被修改?

我只想将函数应用于字典的所有值-_-

我知道如果我使用第二本词典我可以做到这一点。我只是想知道是否有一种简洁优雅的方式来修改字典中的所有值(无需显式创建第二个值)。

最佳答案

试试这个:

foreach (string key in dbFields.Keys.ToList())
     dbFields[key] = MySqlHelper.EscapeString(dbFields[key]);

您不能修改正在迭代的集合,ToList()在这种情况下将创建一个新的 List<string>对你来说,你正在迭代,所以你可以安全地修改字典。

关于评论 - 来自 MSDN :

The Dictionary.KeyCollection is not a static copy; instead, the Dictionary.KeyCollection refers back to the keys in the original Dictionary. Therefore, changes to the Dictionary continue to be reflected in the Dictionary.KeyCollection.

所以这取决于索引器的实现(dbFields[key] = ...)如果 Dictionary 认为键集合已经改变(显然它确实如此,因为有一个异常(exception)) - 不幸的是我现在手头没有 Reflector 否则我可以检查。

关于c# - 在字典的值集合上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749460/

相关文章:

c# - 为什么 'null integer' 在字符串转换后不抛出 'NullReferenceException'?

c# - 并行处理 'stream' 元素同时保持输出有序的好方法

.net - 持久化到数据库时更新或增加值更好吗?

javascript - OWIN 和 Forms Authentication with WEB API 2 with SPA

asp.net - .Net CLR 如何识别哪个 .DLL 是 Web 应用程序中的主(启动)DLL?

c# - 如果以 xamarin 形式选择它,如何清除选择器?

c# - 将现有程序集添加到 mvc 6 项目

c# - 获取 NetworkStream 中可用数据的长度

c# - 响应式用户界面提示

c# - 尝试使用 EF 更新实体并使用 WCF 发送它 - 属性在更新场景中导致异常