C#使用LINQ Query </string,string>更新Dictionary <string,string>

时间:2011-04-02 17:22:38

标签: c# linq

我正在尝试更新存储在词典中的程序设置。奇怪的是,如果它们存储在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
}

4 个答案:

答案 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;