2013-08-06 1 views
2

У меня есть 2 IEnumerable<KeyValuePair<TreeType, int>> коллекции:Установка IEnumerable KeyValuePair

  • _myObject.Trees - содержит все TreeTypes с значениями 0.
  • newTrees - может содержать любое количество TreeTypes с любым значением ИНТ ,

Теперь то, что я хочу сделать, просто, но я пытался часами и не мог получить желаемые результаты. Я хочу вставить значения 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); 
} 

Теперь вы зацикливание только newTrees и Where(...) находит соответствующий элемент (ы) в _myObject.Trees без явного цикла. Обратите внимание, что вызов First() предполагает, что любой ключ в newTrees уже существует в _myObject.Trees и что он существует только один раз.

Надеюсь, это поможет!

+0

большое спасибо за ваше время и помощь (как вы и varocarbas). Я буду тестировать это в течение часа (извините за задержку), но 2 быстрых вопроса: я не вижу, как это фактически меняет коллекцию _myObject.Trees? Кроме того, коллекция _myObject.Trees доступна только для чтения. Мне нужно добавить сеттер или я могу уйти, не делая этого? Большое спасибо :) – user2439970

+0

Просто протестировано и все работает! Еще раз спасибо за помощь. Я ценю это:] – user2439970

1

Хотя подход 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; 
+0

+1 Кажется более правильным только изменить значение, подобное этому, а не изменять весь KeyValuePair, как я сделал в своем ответе, но оба решения должны дать тот же конечный результат (я сделал небольшое редактирование для своего кода после вашего сообщения). – Halvard

+0

@ Halvard Спасибо. Для редактирования это более быстрый подход (рекомендованный везде). В любом случае обратите внимание, что мое первоначальное намерение делало что-то по-другому (итерация через словарь), но ваш цикл явно лучше: комбинация обоих методов является правильным решением здесь :) – varocarbas

+0

Спасибо за помощь. Это очень хороший способ решить мою проблему. – user2439970