Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Копирование списка


Автор: Garcian 17.3.2012, 19:04
Здравствуйте! Читал по этому вопросу различные темки и, честно говоря, ничего не понял.
Думаю проблема ясна: имеется список, содержащий собственный класс, ну например 
Код

Lines = new List<LineSection>();


Пробовал следующие способы для копирования содержимого списка:
Код

_Inside = new List<LineSection>(Lines)
// или
foreach (LineSection line in Lines)
{
      _Inside.Add(line)
 }

В обоих случаях при изменении списка _Inside меняется и содержимое списка Lines. 
Как этого избежать? Хотелось бы с примером  smile 

Автор: YurIOs 17.3.2012, 19:15
Это довольно тривиальная задача. Вы ожидаете что ссылочный тип будет вести себя как простой тип (int, byte, bool и. т. д.)

В примере кода вы копируете не сами сущности LineSection, а только ссылки на них. 

Переопределите метод Clone() для класса LineSection. Тогда сможете получить копию списка где-то таким образом:

Код

List<LineSection> _Inside = Lines.Clone();

Автор: Garcian 17.3.2012, 19:34
Цитата(YurIOs @  17.3.2012,  19:15 Найти цитируемый пост)
В примере кода вы копируете не сами сущности LineSection, а только ссылки на них. 

Да, это я понял. 

Цитата(YurIOs @  17.3.2012,  19:15 Найти цитируемый пост)
Переопределите метод Clone()

А вот здесь, можно по подробнее?

Автор: YurIOs 17.3.2012, 20:32
Ну где-то так:

Код

    public class LineSection : Object, ICloneable
    {
        /// ...
        /// ...
        /// ...
        public object Clone()
        {
            LineSection clone = new LineSection();
            clone.XXX = this.XXX;
            clone.YYY = this.YYY;
            clone.SomeReferenceProperty = this.SomeReferenceProperty.Clone();

            return clone;
        }
    }

Автор: Garcian 17.3.2012, 21:11
Спасибо, разобрался, все работает  smile 
Код

public class LineSection : Object, ICloneable


Единственное что, убрал наследование, только потом заработало)

Код

class LineSection

Автор: YurIOs 17.3.2012, 21:34
Метод Clone()  входит в состав интерфейса LineSection, технология клонирования может работать и без наследования от интерфейса ICloneable. Но чтобы LineSection гармоничней вписывался в .Net наследование от ICloneable лучше оставить smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)