【问题标题】:Setting IEnumerable KeyValuePair设置 IEnumerable KeyValuePair
【发布时间】:2013-08-07 10:05:09
【问题描述】:

我有 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;
            }
        }
    }

非常感谢您的帮助,谢谢!

【问题讨论】:

    标签: c#-4.0 foreach ienumerable keyvaluepair


    【解决方案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 中并且只存在一次。

    希望对你有帮助!

    【讨论】:

    • 非常感谢您的时间和帮助(包括您和 varocarbas)。我将在一小时内对此进行测试(抱歉耽搁了),但有两个简单的问题:我看不出这实际上是如何改变 _myObject.Trees 集合的?此外, _myObject.Trees 集合是只读的。我需要添加一个设置器还是可以不这样做就离开?非常感谢:)
    • 刚刚测试过,一切都很好!再次感谢您的帮助。我很感激:]
    【解决方案2】:

    虽然 Halvard 方法为主要问题提供了一个很好的解决方案(对他来说 +1),但它并没有明确说明如何将值存储在目标位置。在这里,您有一个更正版的 Halvard 代码,它依赖于最典型的方法:Dictionary (one 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;
    

    【讨论】:

    • +1 只更改这样的值而不是像我在回复中那样更改整个 KeyValuePair 似乎更正确,但是两种解决方案都应该给出相同的最终结果(我对我的代码在你的帖子之后)。
    • @Halvard 谢谢。对于编辑,这是一种更快的方法(到处推荐的方法)。在任何情况下,请注意我的初衷是做不同的事情(遍历字典),但你的循环显然更好:两种方法的组合是正确的解决方案:)
    • 感谢您的帮助。这是解决我的问题的好方法。
    • @user2439970 没问题。但最初的循环来自 Halvard,所以他是值得获奖的人:干得好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多