2014-10-02 53 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都被刪除。因此,當我從secondList中移除20個項目時,相同的元素將從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歲秒。至少我擊敗了Korneyev先生;) – Pieter21 2014-10-02 12:57:36

0

你的假設:

List<T> secondList = firstList //copyOfFirstList 

只是部分正確。這是一個淺參考副本嗎?

secondList引用不同變量中的同一個對象。

谷歌的deepcopy的列表找到符合您的期望

+0

「它是一個淺參考副本」我_think_是指'secondList'中的參考被「複製」到'firstList',這是正確的。但是,我首先將它讀爲_true_ [「淺拷貝」](http://en.wikipedia.org/wiki/Object_copy#Shallow_copy),這意味着該對象的每個字段的值被複制,即_not_真正。我會考慮'.ToList()'一個「淺拷貝」,因爲它複製列表中的所有_references_,但不會複製引用指向的對象。事實上,淺拷貝將會解決原始問題。 – 2014-10-02 13:02:29

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); 
     } 
    } 
相關問題