2016-12-20 3 views
1

Мне нужно изменить все значения в словаре. Как правило, изменение словаря при перечислении его вызывает исключение. Существует множество способов обойти это, но все ответы, которые я видел, связаны с распределением временного хранилища. См. Пример Editing dictionary values in a foreach loop.Изменить значения словаря без выделения

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

+0

Любые причины, по которым вы не хотите использовать 'ConcurrentDictionary'? Является ли ваша проблема действительно исключением для параллельного доступа или распределения памяти? –

+1

Ссылка, которую вы указали, указывает на то, что вызов Keys.ToList() в словаре и итерация по этому списку должны работать ... Нет? –

+1

@IanMercer: Хотя вопрос очень неясен. Я считаю, что исключение, на которое ссылается OP, - это тот, который модифицирует коллекцию при ее итерации. Это не проблема с одновременным доступом. –

ответ

3

Вы определенно попадаете в какую-то ничтожную оптимизацию производительности.

Основываясь на дополнительной информации, которую вы указали в комментариях, это звучит как лучший подход (не дожидаясь обновления памяти, чтобы вы могли обрабатывать немного больше распределения), вероятно, будет принимать Dictionary source code и создавать новый класс специально для этой цели, который не увеличивает поле version, если он только меняет значение.

+0

Я боялся этого вывода. Вероятно, вам следует обновить ссылку, хотя указывать на реализацию .Net Core, а не на источник ссылок по причинам лицензирования. Лицензия MIT разрешает модификацию, если вы следуете некоторым правилам, тогда как лицензия MS-RSL не позволяет практически ничего, кроме «ссылки» на источник. –

+0

Готово. Хорошая точка зрения. – StriplingWarrior

+0

В конце концов, этот маршрут проработал довольно хорошо. Я закончил со словарем, который вы можете выполнять итерацию и замену значений во время итерации или даже удалять ключи при повторном запуске. –

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