2014-10-02 11 views
0

я следующий код:C# list.remove (элемент) удаляет элемент из другого списка Я хочу

List<T> firstList; //list with some items 
List<T> secondList = firstList //copyOfFirstList 


List<T> elementsToDelete = secondList.FindAll(whichShouldIDelete); 


foreach(var item in elementsToDelete){ 
    secondList.Remove(item); 
} 

Проблема заключается в том, что метод Remove() не удаляет элементы только из secondList. Элементы удаляются из firstList и secondList. Поэтому, когда я удаляю 20 элементов из secondList, те же элементы удаляются из firstList. Что может быть причиной этой ситуации?

ответ

3

Проблема с этой линии:

List<T> secondList = firstList //copyOfFirstList 

Это не создает копию списка, а в настоящее время существует два ссылки, указывающие на тот же экземпляр списка.

Вы можете сделать:

List<T> secondList = firstList.ToList(); // explicitly creating a new list. 

или

List<T> secondList = new List<T>(firstList); 

Но помните, что если ваш List<T> имеет ссылочный тип (класс) то объект каждого списка будет указывать на тот же экземпляр , (Неглубокая копия объекта будет доступна). Так что если вы делаете:

firstList[0].SomeProperty = 2; 

и если этот элемент существует в secondList, то вы увидите изменения свойств во втором списке, а также.

+1

Вы избили меня 19 секунд. По крайней мере, я избил г-на Корнеева;) – Pieter21

0

Ваше предположение:

List<T> secondList = firstList //copyOfFirstList 

лишь частично прав. Это мелкая справочная копия.

Второй список относится к одному и тому же объекту в другой переменной.

Google для DeepCopy Список, чтобы найти ответы, которые могут соответствовать вашим ожиданиям

+0

«Это мелкая копия ссылок». Я хочу сказать, что ссылка в 'secondList'« скопирована »на' firstList', что верно. Тем не менее, я сначала прочитал его как _true_ [«мелкая копия»] (http://en.wikipedia.org/wiki/Object_copy#Shallow_copy), что означает, что значение каждого поля объекта копируется, что является _not_ правда. Я бы рассмотрел '.ToList()' a "мелкую копию", поскольку он копирует все _references_ в списке, но не копирует объекты, на которые ссылаются ссылки. Фактически, мелкая копия должна решить первоначальную проблему. –

0

Как List<T> является ссылочным типом, не дорожил один, то List<T> secondList = firstList; не копия, а просто ссылка на тот же объект.

0

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

попробовать

List<T> firstList = new List<T>(); 
List<T> secondList = new List<T>(); 
secondList.AddRange(firstList); 
0
public static List<T> CloneList<T>(List<T> oldList) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     MemoryStream stream = new MemoryStream(); 
     formatter.Serialize(stream, oldList); 
     stream.Position = 0; 
     return (List<T>)formatter.Deserialize(stream); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     List<string> firstList = new List<string>() { "1", "2", "3"}; //list with some items 
     List<string> secondList = CloneList(firstList); //copyOfFirstList 

     List<string> elementsToDelete = new List<string>() { "1" }; // do some logic to find all items you need to delete 

     foreach (var item in elementsToDelete) 
     { 
      secondList.Remove(item); 
     } 
    } 
Смежные вопросы