2011-04-02 50 views
1

我试图更新我的程序设置,它们存储在字典中。奇怪的是,如果他们被存储在一个DatabaseContext中,下面的函数将工作(我认为),但由于他们在一个字典中,我得到一个编译器错误。为什么我的KeyValuePair.Value只读?更重要的是,如何重新编写以下函数来实际更新字典?C#用LINQ查询更新字典<字符串,字符串>

感谢

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 
} 

回答

7

坦白地说,我宁愿写如下:

settings[setting] = value; 

,而不是有这个putSetting方法,其被剥夺的任何自然感的存在。我必须承认,在代码审查期间,我看过很多的东西,但这个是赢家。

4

KeyValuePairValue总是只读的。注意decleration

public TValue Value { get; } 

使用

settings[setting] = value; 

代替。看到这是多么短,我不知道你真的用这种方法获得什么。

5

它不仅是正确的,因为Value是只读的,你也应该考虑的是,KeyValuePair本身就是一个结构 - 所以KeyValuePair你后你的查询是一个新的实例,而不是那个在参考Dictionary


我有点困惑为什么你使用linq这个?

对于Dictionary<string,string>你可以使用:

settings[setting] = value 
2

有一对夫妇使用这种方法的问题。

  • qry的类型是KeyValuePair<TKey, TValue>。这是一个只读结构,这意味着你不能改变它的属性。
  • 此外,由于它是一个结构,它是Dictionary<TKey, TValue>中的结构的副本。即使你可能改变它,它也不会更新Dictionary<TKey, TValue>内的值,因此也不会产生效果

什么你要找的是这里的Dictionary<TKey, TValue>它允许对价值观的插入索引一个给定的键

settings[setting] = value; 
+0

谢谢,你们是摇滚明星! – BenMaGoo 2011-04-02 18:46:19

相关问题