2013-08-06 35 views
2

我有2個IEnumerable<KeyValuePair<TreeType, int>>類別:設置了IEnumerable KeyValuePair

  • _myObject.Trees - 包含所有的0
  • newTrees值TreeTypes - 可以包含任意數量TreeTypes與任何int值。

現在我想要做的事情很簡單,但我一直在嘗試幾個小時,無法完全達到預期的效果。我想將newTrees值插入到_myobject.Trees集合中,以便_myObject.Trees值不會全部爲0.

我得到的距離最近。我知道爲什麼這不起作用,但我再次看不到解決方案。

foreach (var tree in _myObject.Trees) 
    { 
     foreach (var newTree in newTrees) 
     { 
      if (tree.Key == newTree.Key) 
      { 
       _myObject.Trees[tree] = 
        new KeyValuePair<TreeType, int>(newTree.Key, newTree.Value); 
       break; 
      } 
     } 
    } 

非常感謝幫助,謝謝!

回答

1

你能嘗試類似如下:

foreach (var tree in newTrees) 
{ 
    var keyValuePair = _myObject.Trees.Where(s => s.Key == tree.Key).First(); 
    keyValuePair = new KeyValuePair<Tree, int>(tree.Key, tree.Value); 
} 

現在你只循環的newTreesWhere(...)發現在_myObject.Trees相應的元素(S)沒有明確的循環。請注意,對First()的調用假定newTrees中的任何密鑰已存在於_myObject.Trees中,並且它只存在一次。

我希望它有幫助!

+0

非常感謝您的時間和幫助(你和varocarbas)。我會在一小時內測試這個(對於延遲抱歉),但是有兩個簡單的問題:我沒有看到_myObject.Trees集合是如何改變的?另外,_myObject.Trees集合是隻讀的。我需要添加一個setter,或者我可以不用這樣做而離開?非常感謝:) – user2439970

+0

剛剛測試過,所有作品都是一種享受!再次感謝您的幫助。我很感激:] – user2439970

1

雖然哈爾瓦德方法爲主要問題提供了一個很好的解決方案(對他來說+1),但它沒有明確說明如何將值存儲在目標位置。在這裏,你有Halvard代碼修正版本依靠最典型的做法:一個Dictionaryone of the multiple posts talking about this):

Dictionary<TreeType, int> dict = _myObject.Trees.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
foreach (var tree in newTrees) 
{ 
    var keyValuePair = _myObject.Trees.Where(s => s.Key == tree.Key); 
    if (keyValuePair.Count() > 0) 
    { 
     dict[keyValuePair.First().Key] = tree.Value; //Value of the given tree associated with the current Key of _myObject.Trees 
    } 
} 

_myObject.Trees = dict; 
+0

+1似乎更正確的只是改變這樣的值,而不是像我在我的回覆中那樣改變整個KeyValuePair,但兩種解決方案都應該給出相同的最終結果(我對代碼做了一個小修改在你的帖子後)。 – Halvard

+0

@Halvard謝謝。對於編輯,這是一個更快的方法(到處推薦的方法)。無論如何,請注意我的初衷是以不同的方式做事(遍歷字典),但是你的循環顯然更好:兩種方法的組合都是正確的解決方案:) – varocarbas

+0

感謝您的幫助。這是解決我的問題的好方法。 – user2439970

相關問題