新建集合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中,进一步说明,listA与listB指向的为同一个集合(具体见下面所给示意图)。
接下来,新建集合listC,同时遍历集合listA中,将其元素一一添加进集合listC。
List<Student> listC = new List<Student>(); foreach (Student i in listA) { listC.Add(i); }
遍历listA,listC中所有元素进行输出。执行代码,得到下图所示结果。
由结果可以看出,此时listA与listB中所含元素一致。
接着,使用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" });
遍历listA,listC输出其元素,得到下图所示结果。
从结果可知,listC增加了新元素,而listA中的元素保持不变。至于原因这里就不做过多解释了。
总之,我们将一个集合中的元素“克隆”至另一个集合时,一定要清楚,这两个集合之间是否存在什么样的关系,不然可能会出现一些不必要的错误。
使用List的Remove方法时想起的小问题