首页 > 代码库 > 使用List的Remove方法时想起的小问题

使用List的Remove方法时想起的小问题

新建集合listA,包含5个元素。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}
List<Student> listA = new List<Student>();
listA.Add(new Student() { Id = 1, Name = "yl1" });
listA.Add(new Student() { Id = 2, Name = "yl2" });
listA.Add(new Student() { Id = 3, Name = "yl3" });
listA.Add(new Student() { Id = 4, Name = "yl4" });
listA.Add(new Student() { Id = 5, Name = "yl5" });

新建集合listB,listB的引用指向listA。

List<Student> listB = listA;

遍历listA,listB中所有元素进行输出。

foreach (Student i in listA)
{
    Console.WriteLine("listA:" + i.Id.ToString() + ";" + i.Name);
}
foreach (Student j in listB)
{
    Console.WriteLine("listB:" + j.Id.ToString() + ";" + j.Name);
}
得到下图所示结果。

 

使用Remove方法移除listA中的第一个和最后一个元素。

listB.Remove(listA.First());
listB.Remove(listA.Last());
再次遍历listA,listB中所有元素进行输出(具体代码省略),得到下图所示结果。

 

从图中结果可以看出:在对listA执行Remove方法前后,listA与ListB中所包含的元素完全一致。这是因为listA与listB指向的是同一个集合,所以对listA执行Remove方法移除其中元素的同时,集合ListB中的元素同样会被移除。(具体见下面所给示意图)


接着,我们为集合listB增加一个新的元素。

listB.Add(new Student() { Id = 6, Name = "yl6" });

再次遍历listA,listB中所有元素进行输出(具体代码省略),得到下图所示结果。

 

从图中可以看出,listB中增加的新元素同样存在于listA中,进一步说明,listAlistB指向的为同一个集合(具体见下面所给示意图)。

 

 

接下来,新建集合listC,同时遍历集合listA中,将其元素一一添加进集合listC

List<Student> listC = new List<Student>();
foreach (Student i in listA)
{
     listC.Add(i);
}
遍历listA,listC中所有元素进行输出。执行代码,得到下图所示结果。

 

由结果可以看出,此时listAlistB中所含元素一致。

接着,使用Remove方法移除listC中的第一个和最后一个元素。

listC.Remove(listA.First());
listC.Remove(listA.Last());

再次遍历listA,listC中所有元素进行输出,得到下图所示结果。

 

由结果可知,listC中的第一个和最后一个元素被移除,而listA中的元素保持不变。这是因为遍历listA并将其元素一一添加进listC的本质是将指向listA中各元素的引用一一添加进了集合listC,而对listC执行Remove方法时移除的是指向集合A中元素的引用,不会影响到集合listA中所包含的元素(具体见下面示意图所示)。

 

接着,为listC增加新元素。

listC.Add(new Student() { Id = 6, Name = "yl6" });

遍历listAlistC输出其元素,得到下图所示结果。

 

从结果可知,listC增加了新元素,而listA中的元素保持不变。至于原因这里就不做过多解释了。

总之,我们将一个集合中的元素“克隆”至另一个集合时,一定要清楚,这两个集合之间是否存在什么样的关系,不然可能会出现一些不必要的错误。