2011-04-02 48 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

相關問題