C#list.remove(item)从我想要的其他列表中删除项目

时间:2014-10-02 12:53:56

标签: c# linq

我有以下代码:

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中删除。这种情况可能是什么原因?

5 个答案:

答案 0 :(得分: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 :(得分:0)

你的假设:

List<T> secondList = firstList //copyOfFirstList

只是部分正确。这是一个浅的参考副本。

secondList引用不同变量中的同一个对象。

Google for DeepCopy List可以找到符合您预期的答案

答案 2 :(得分:0)

由于List<T>是引用类型,而不是值1,因此List<T> secondList = firstList;不是副本,而只是对同一对象的引用。

答案 3 :(得分:0)

这是因为两个列表都指向相同的“地址”,因此编辑一个会影响另一个。

尝试

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

答案 4 :(得分: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);
        }
    }