Как глубоко клонировать взаимосвязанные объекты в C #? - PullRequest
5 голосов
/ 26 марта 2009

Как лучше всего глубоко клонировать взаимосвязанный набор объектов? Пример:

class A {
    B theB; // optional
    // ...
}

class B {
    A theA; // optional
    // ...
}

class Container {
    A[] a;
    B[] b;
}

Очевидная вещь, которую нужно сделать, это пройтись по объектам и глубоко клонировать все, как я подхожу к этому. Однако это создает проблему - если я клонирую A, который содержит B, и что B также находится в Container, то B будет клонирован дважды после того, как я клонирую Container.

Следующим логическим шагом является создание Dictionary и поиск каждого объекта, прежде чем я его клонирую. Однако, похоже, что это может быть медленное и неблагодарное решение.

Есть мысли?

Ответы [ 6 ]

2 голосов
/ 26 марта 2009

Конечно, это не элегантное решение, но нередко использовать словарь (или hashmap). Одним из преимуществ является то, что хэш-карта имеет постоянное время поиска, поэтому скорость здесь не сильно сказывается.

2 голосов
/ 26 марта 2009

Не то, чтобы я был знаком с C #, но обычно для любого типа сканирования графа для какой-либо обработки требуется таблица поиска, чтобы остановить обработку объекта из-за циклических ссылок. Поэтому я думаю, что вам нужно сделать то же самое здесь.

2 голосов
/ 26 марта 2009

Предложенное вами словарное решение - лучшее, что я знаю. Для дальнейшей оптимизации вы можете использовать object.GetHashCode (), чтобы получить хеш для объекта, и использовать его в качестве ключа словаря. Должно быть быстрым, если вы не говорите об огромных деревьях объектов (от 10 до 100 тысяч объектов).

0 голосов
/ 08 июля 2015

Одним из практических способов глубокого клонирования является сериализация, а затем десериализация исходного графа. Некоторые сериализаторы в .NET, такие как DataContractSerializer, даже способны обрабатывать циклы внутри графиков . Вы можете выбрать, какой сериализатор является лучшим выбором для вашего сценария, взглянув на таблицу сравнения функций .

0 голосов
/ 26 марта 2009

Другое возможное решение, которое вы можете исследовать, - это сериализация объектов в поток, а затем реконструкция их из того же потока в новые экземпляры. Это часто творит чудеса, когда все остальное кажется ужасно запутанным и грязным.

Марк

0 голосов
/ 26 марта 2009

может создать битовый флаг, чтобы указать, был ли этот объект клонирован ранее.

...