Глубокое клонирование объекта List - PullRequest
0 голосов
/ 21 октября 2018

Мне нужно знать, как глубоко клонировать объект List <Business>.Я попробовал следующее:

List< Business> owner = bus.Select(m => new Business{
    Businessname= m.Businessname,
    Locations= m.Locations,

 }).ToList();

Я удалил объект (Locations - Locations - это List <Country>) из owner объекта.Я не ожидал никаких изменений в объекте bus, так как клонировал его, как показано в приведенном выше коде.

Однако объект Locations также был удален из объекта bus.Может кто-нибудь сказать мне, как это исправить?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

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

var str = JsonConvert.SerializeObject(myList);
var deepCopy = JsonConvert.DeserializeObject<List<MyObject>>(str);

Однако это, вероятно, не самый быстрый способ, поскольку он требует много дополнительных усилий.работа и распределение.

0 голосов
/ 21 октября 2018

Вы должны выполнить операцию клонирования следующим образом:

List< Business> owner = bus.Select(m => new Business
{
    Businessname = m.Businessname,
    Locations = m.Locations?.Select(l => new Country { /*here goes your initialization*/})
})
.ToList();

Оператор ? выполняет проверку на ноль, и если поле Locations равно null, оно останавливает выполнение и возвращает null, в противном случаевыполняет операцию Select.

Обратите внимание, что если объект Country также содержит поля со ссылками на тип, вы должны явно создать эти объекты и скопировать все поля.

...