设置IEnumerable KeyValuePair

时间:2013-08-06 11:56:00

标签: c#-4.0 foreach ienumerable keyvaluepair

我有2个IEnumerable<KeyValuePair<TreeType, int>>个集合:

  • _myObject.Trees - 包含值为0的所有TreeType。
  • newTrees - 可以包含任意数量的具有任何int值的TreeType。

现在我想做的事情很简单,但我已经尝试了几个小时,但却无法获得理想的结果。我想将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;
            }
        }
    }

真的很感谢帮助,谢谢!

2 个答案:

答案 0 :(得分: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中找到相应的元素,而不显式循环。请注意,对First()的调用假定newTrees中的任何键已经存在于_myObject.Trees中并且只存在一次。

我希望它有所帮助!

答案 1 :(得分:1)

尽管Halvard方法为主要问题提供了一个很好的解决方案(对他来说是+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;