2017-01-24 2 views
1

Я хочу обновить данные. Из входных данных, преобразованных в одну структуру из одного словаря в другой словарь, мои уже существующие данные.Загрузка данных из одного Словаря в другой

Псевдо код:

Dictionary<foo, bar> originalData; // Count = 128 
Dictionary<foo, bar> inputData; // Count = 112 

Я мог бы просто написать следующий код:

foreach (var key in originalData.Keys) 
{ 
    if (inputData.ContainsKey(key)) 
    { 
     originalData[key] = inputData[key]; 
    } 
} 

Но это, конечно, будет производить следующее сообщение об ошибке:

"Collection was modified; enumeration operation may not execute."

Что является лучшим способ справиться с этой операцией?

+1

Вы пробовали 'Еогеасп (ключ уаг в originalData.Keys.ToList())'? – wkl

+1

Разве не имеет смысла делать это наоборот? –

+0

@wkl Да, я уже сделал .ToList(), он работает. –

ответ

3

Вы можете начать с другого конца: вместо переборе originalData итерацию inputData:

foreach (var pair in inputData) { 
    if (originalData.ContainsKey(pair.Key)) { 
     originalData[pair.Key] = pair.Value; 
    } 
} 

Обратите внимание, что при переборе пар ключ-значение вы избежать второй просмотровых в inputData.

Вы можете пойти дальше и конвертировать if в LINQ:

foreach (var pair in inputData.Where(p => originalData.ContainsKey(p.Key))) { 
    originalData[pair.Key] = pair.Value; 
} 
+0

Мне нравится ваш ответ LINQ! Я действительно использую это в своем коде! –

3

Почему бы не обойти итератор? Это безопасно, поскольку вы проверяете ключи на существование в обоих словарях.

foreach (var key in inputData.Keys) 
{ 
    if (originalData.ContainsKey(key)) 
    { 
     originalData[key] = inputData[key]; 
    } 
} 
+0

Но, конечно же! Дурак я! –

1

Ваша проблема заключается в том, что вы изменяете коллекцию вы итерация. Вы можете использовать LINQ ToArray итерировать на копии ключей и избежать вашей проблемы:

foreach (var key in originalData.Keys.ToArray()) 
{ 
    if (inputData.ContainsKey(key)) 
    { 
     originalData[key] = inputData[key]; 
    } 
} 
+2

Это не очень эффективно ... Другие ответы не ожидают, что вы создадите новый массив. Что делать, если есть 1000 предметов? Вы собираетесь создать массив именно для этого? –

+0

@PatrickHofman: Да, я создаю массив именно для этого. Модификация коллекции, которую вы итерируете, является общей проблемой, и вы не можете просто обойти итерацию. В этих случаях вам нужно было повторить итерацию на копии ключей. Я делал это часто, и эффективность никогда не становилась проблемой. – Sefe

+0

Но не в этом случае. –

Смежные вопросы