2013-10-09 20 views
-3

說我有兩個字典:的毗連兩個詞典,使原來的共享密鑰更新

Dictionary<string, string> orig = new Dictionary <string, string>(); 
orig.Add("one", "value one"); 
orig.Add("two", ""); 
orig.Add("three", ""); 

Dictionary<string, string> newDict = new Dictionary <string, string>(); 
newDict.Add("one", "this value should not be added"); 
newDict.Add("two", "value two"); 
newDict.Add("three", "value three"); 

我該如何合併兩個庫,這樣所產生的字典更新密鑰只有在其對應的值是空的?此外,合併不應添加new中的任何密鑰,但不會添加在orig中。也就是說,「one」仍然具有「value one」的值,而「two」和「three」則更新爲new的值。

我試着用orig.Concat(new);,但給我留下原來的字典。也許這可以用LINQ來完成?

+0

這不能用LINQ來完成。 – SLaks

+0

@SLaks你介意闡述嗎? – tnw

+0

LINQ是關於_queries_;它不能改變現有的對象。 – SLaks

回答

6

嘗試:

orig = orig.Keys.ToDictionary(c => c, c=>(orig[c] == "" ? newDict[c] : orig[c])); 
+2

這也應該檢查以確保密鑰存在於第二個字典中。 – Servy

+2

@Servy,你是對的,但我從OP給出的例子中推斷出這兩個詞典具有匹配的關鍵集合。我推理的原因是orig字典中存在空字符串值。如果有可能兩個字典沒有匹配的密鑰集合,請這麼說,我將修改我的答案代碼。 –

+0

@BolucPapuccuoglu一個正確的推論,所以這適合我的具體用例。然而,Servy會是正確的,以獲得更廣泛的解決方案。非常感謝你! – tnw

1

我想,當他們有助於澄清意圖使用foreach

foreach (var pair in orig.Where(x=> string.IsNullOrEmpty(x.Value)).ToArray()) 
{ 
    orig[pair.Key] = newone[pair.Key]; 
} 
1

擴展方法「單行」是偉大的,但這樣的事情,我會傾向於用一個明確的循環寫一個小方法來完成所需的操作。我認爲這是比使用各種擴展方法轉換創建一個新的字典更清潔:

public void PopulateMissingValues(Dictionary<string, string> orig, Dictionary<string, string> newDict) 
    { 
     foreach (var pair in orig.Where(p => p.Value == string.Empty)) 
     { 
      string newValue; 
      if (newDict.TryGetValue(pair.Key, out newValue)) 
       orig[pair.Key] = newValue; 
     } 
    } 
2

這個循環,你想要做有效的東西和可讀性:

Dictionary<string, string> result = new Dictionary<string, string>(); 
foreach (var keyVal in orig) 
{ 
    if (!string.IsNullOrEmpty(keyVal.Value)) 
     result.Add(keyVal.Key, keyVal.Value); 
    else 
    { 
     string val2; 
     if (newDict.TryGetValue(keyVal.Key, out val2)) 
      result.Add(keyVal.Key, val2); 
     else 
      result.Add(keyVal.Key, ""); 
    } 
} 

結果:

one, value one 
two, value two 
three, value three