我正在尝试更新存储在词典中的程序设置。奇怪的是,如果它们存储在DatabaseContext中,以下函数可以工作(我认为),但由于它们在字典中,我收到编译器错误。为什么我的KeyValuePair.Value只读?更重要的是,如何重新编写以下函数来实际更新字典?
谢谢
public void putSetting(Dictionary<string, string> settings, string setting, string value)
{
var qry = (from s in settings
where s.Key == setting
select s).Single();
qry.Value = value; // Error 1 Property or indexer
// 'System.Collections.Generic.KeyValuePair<string,string>.Value'
// cannot be assigned to -- it is read only
}
答案 0 :(得分:7)
老实说,我更愿意写下以下内容:
settings[setting] = value;
而不是这种putSetting
方法被剥夺了任何自然存在感。我必须承认,我在代码审查过程中看到过很多的东西,但这个是胜利者。
答案 1 :(得分:5)
只有Value
只读是正确的,你还应该考虑KeyValuePair
本身就是结构 - 所以你有KeyValuePair
在您的查询是新实例后,而不是对Dictionary
。
我有点困惑你为什么要使用linq呢?
对于Dictionary<string,string>
,您可以使用:
settings[setting] = value
答案 2 :(得分:4)
Value
的{{1}}始终是只读的。请注意声明
KeyValuePair
使用
public TValue Value { get; }
代替。看到这有多短,我不确定你用这种方法获得了什么。
答案 3 :(得分:2)
这种方法存在一些问题。
qry
的类型是KeyValuePair<TKey, TValue>
。这是一个只读结构,这意味着你不能改变它的属性。 Dictionary<TKey, TValue>
内部结构的副本。即使你可以改变它,它也不会更新Dictionary<TKey, TValue>
内的值,因此不会产生影响您在这里寻找的是Dictionary<TKey, TValue>
上的索引器,它允许插入给定键的值
settings[setting] = value;