Как скопировать список объектов из объекта в другой объект - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть класс сущностей, имя которого - Person. Сущность Person имеет список сущностей Asset.

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public IList<Asset> Assets { get; set;}
}

Например, у меня есть два человека (человек1 и человек2). Мне нужно скопировать список активов от человека1 до человека2. Я делаю это как следующий код:

Person person1 = LoadById(1);
Person person2 = LoadById(2);

// person2.Assets = person1.Assets;   // Is it correct?

foreach(Asset item in person1.Assets)
{
    //person2.Assets.Add(item);
    Asset asset = new Asset();
    asset.Title = item.Title;
    asset.Description = item.Description;

    asset.Person = person2;        

    person2.Add(asset);
}    

person2.Update();

Есть лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

Свойство Assets является ссылкой на список.person2.Assets = person1.Assets; будет означать, что они совместно используют и указывают на один и тот же список, поэтому не будут разделяться.

Вы хотите сделать:

person2.Assets = new List<Asset>(person1.Assets);

(Просто собираюсь проверить эту перегрузку, ноэто должно скопировать все содержимое ) ... Да, это должно сделать это.

Если вы хотите добавить их, а не заменить, используйте это:

person2.Assets.AddRange(person1.Assets);

Вы можете получить дубликаты, однако.Вы можете сделать это, если не хотите: Linq для сущностей: Unions + Distinct

Также у вас есть дополнительная () - ваша первая строка должна быть просто public class Person.

0 голосов
/ 21 декабря 2011

В качестве отправной точки я рекомендую эту документацию MSDN для MemberwiseClose метода .

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

Если вам действительно нужна копия deep , статья предлагает следующие стратегии:

Существует множество способов реализовать операцию глубокого копирования, если операция поверхностного копирования, выполняемая методом MemberwiseClone, не соответствует вашим потребностям.К ним относятся следующие:

  • Вызовите конструктор класса объекта, который нужно скопировать, чтобы создать второй объект со значениями свойств, взятыми из первого объекта.Это предполагает, что значения объекта полностью определяются его конструктором класса.

  • Вызовите метод MemberwiseClone, чтобы создать поверхностную копию объекта, а затем назначьте новые объекты, значения которых являютсятакой же как исходный объект для любых свойств или полей, значения которых являются ссылочными типами.Метод DeepCopy в этом примере иллюстрирует этот подход.

  • Сериализует объект для глубокого копирования, а затем восстанавливает сериализованные данные в другую переменную объекта.

  • Использование отражения с рекурсией для выполнения операции глубокого копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...