我有以下代码:
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中删除。这种情况可能是什么原因?
答案 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);
}
}