Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование списка, Элементы списка - собственный класс.  
V
    Опции темы
Garcian
  Дата 17.3.2012, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



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

Lines = new List<LineSection>();


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

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

В обоих случаях при изменении списка _Inside меняется и содержимое списка Lines. 
Как этого избежать? Хотелось бы с примером  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
YurIOs
Дата 17.3.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: 1
Всего: 1



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

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

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

Код

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


Это сообщение отредактировал(а) YurIOs - 17.3.2012, 19:16
PM ICQ   Вверх
Garcian
Дата 17.3.2012, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



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

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

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

А вот здесь, можно по подробнее?
--------------------
Неродивый студент
PM MAIL   Вверх
YurIOs
Дата 17.3.2012, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: 1
Всего: 1



Ну где-то так:

Код

    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;
        }
    }


Это сообщение отредактировал(а) YurIOs - 17.3.2012, 20:42
PM ICQ   Вверх
Garcian
Дата 17.3.2012, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Спасибо, разобрался, все работает  smile 
Код

public class LineSection : Object, ICloneable


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

Код

class LineSection


Это сообщение отредактировал(а) Garcian - 17.3.2012, 21:16
--------------------
Неродивый студент
PM MAIL   Вверх
YurIOs
Дата 17.3.2012, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: 1
Всего: 1



Метод Clone()  входит в состав интерфейса LineSection, технология клонирования может работать и без наследования от интерфейса ICloneable. Но чтобы LineSection гармоничней вписывался в .Net наследование от ICloneable лучше оставить smile 
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.