У меня есть общий словарь, Dictionary<string, T>
который я хотел бы по существу сделать Clone () из ... любых предложений.
c#
generics
collections
clone
mikeymo
источник
источник
entry.Value
Значение может быть еще один [суб] коллекция.Clone()
метода, глубокого или мелкого. Я добавил примечание на этот счет.ConcurrentDictionary
.(Примечание: хотя версия для клонирования потенциально полезна, для простой поверхностной копии лучше использовать конструктор, о котором я упоминал в другом посте.)
Насколько глубокой должна быть копия и какую версию .NET вы используете? Я подозреваю, что LINQ-вызов ToDictionary, указывающий и ключ, и селектор элемента, будет самым простым способом, если вы используете .NET 3.5.
Например, если вы не возражаете против значения, являющегося мелким клоном:
Если вы уже ограничивали T для реализации ICloneable:
(Они не проверены, но должны работать.)
источник
источник
Для .NET 2.0 вы можете реализовать класс, который наследует
Dictionary
и реализуетICloneable
.Затем вы можете клонировать словарь, просто вызвав
Clone
метод. Конечно, эта реализация требует, чтобы тип значения словаря реализовывалICloneable
, но в общем случае универсальная реализация вообще не практична.источник
У меня это нормально работает
Как описывает Томер Вольберг в комментариях, это не работает, если тип значения является изменяемым классом.
источник
Вы всегда можете использовать сериализацию. Вы можете сериализовать объект, а затем десериализовать его. Это даст вам глубокую копию словаря и всех предметов внутри него. Теперь вы можете создать полную копию любого объекта, помеченного как [Serializable], без написания какого-либо специального кода.
Вот два метода, которые будут использовать двоичную сериализацию. Если вы используете эти методы, вы просто вызываете
источник
Лучший способ для меня это:
источник
Метод двоичной сериализации работает нормально, но в моих тестах он показал, что он в 10 раз медленнее, чем реализация клонов без сериализации. Протестировано на
Dictionary<string , List<double>>
источник
ToBinary()
вSerialize()
методе вызываетсяthis
вместоyourDictionary
. Затем вFromBinary()
byte [] сначала копируется вручную в MemStream, но он может быть просто передан в свой конструктор.Вот что мне помогло, когда я пытался глубоко скопировать словарь <строка, строка>
Удачи
источник
Попробуйте это, если ключ / значения ICloneable:
источник
Отвечая на старый пост, я счел полезным обернуть его следующим образом:
источник