使用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中,进一步说明,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方法时想起的小问题

时间: 2024-12-18 17:54:03

使用List的Remove方法时想起的小问题的相关文章

EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

EntityFramework Core 1.1方法理论详解 当我们利用EF Core查询数据库时如果我们不显式关闭变更追踪的话,此时实体是被追踪的,关于变更追踪我们下节再叙.就像我们之前在EF 6.x中讨论的那样,不建议手动关闭变更追踪,对于有些特殊情况下,关闭变更追踪可能会导致许多问题的发生. 实体状态 对于EF Core 1.1中依然有四种状态,有的人说不是有五种状态么,UnChanged.Added.Modified.Deleted.Detached.如果我们按照变更追踪来划分的话,实际

C# Datatable删除行的Delete和Remove方法

delete和remove Delete的使用是 datatable.Rows[i].Delete(); Remove的使用是datatable.Rows.Remove(datatable.Rows[i]); 这两个的区别是,使用delete后,只是该行被标记为deleted,但是还存在,用Rows.Count来获取行数时,还是删除之前的行数.需要使用datatable.AcceptChanges()方法来提交修改. 而Remove方法则是直接删除. 如果在for循环里删除行的话,最好是使用de

Iterator的remove方法可保证从源集合中安全地删除对象(转)

import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorTest{ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("Test1"); list.add("Test2&qu

探讨迭代器中为什么不能通过集合的方式删元素而是使用迭代器中的remove()方法经行删除

由该链接引发的思考:http://bbs.itheima.com/forum.php?mod=viewthread&tid=26270&mobile=1 看到这篇文章后,一副似懂非懂的样子,果断将楼主的代码拷贝到eclipse中运行了下,果断发现了些问题. 经过测试,发现总是在当集合中倒数第二个满足条件时程序才可以正常运行,否则,就会抛出ConcurrentModificationException异常 然后,我在while{it.hasNext()){和String str = (Str

Datatable删除行的Delete和Remove方法介绍

在实际项目开发中,如果要删除DataTable中的某一行,大约有以下几种办法: 使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index):可以直接删除行 datatable.Rows.Delete().Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除

javascript 数组的remove方法

javascript原生一直没有提供删除功能,于是自己写了几个remove方法,主要是要注意遍历数组时使用splice方法是会在遍历没完成时就会改变数组对象的length长度,最简单方法是从数组尾部开始遍历,用递减来循环,就像我这里LastRmove的注释部分,这种方法直观又不受长度动态变化 的影响,然后我想是不是也要像undescore一样加上前后顺序和匹配到第一个就返回这种功能,于是就作了些小改动,可以从头部或是尾部匹配第一个移除后就返回,或是遍历整个数组. // 遍历整个数组,移除匹配it

Datatable删除行的Delete和Remove方法

1.DataRow row = dt.NewRow();      一个DataRow对象刚被创建之后其状态是Detached,是孤立的一个存在,所以建立了DataRow之后在DataRow中的单元填充了数据后还要通过     DataTable.Rows.Add(row);     方法将此DataRow添加到DataTable,DataRow添加到DataTable后, 这个DataRow的状态就转变为Added.     当修改了这个DataRow后,这个DataRow状态转为Modifi

remove() 方法的兼容问题

一直以为jq的remove()方法是兼容的,今天才发现,原来ie的写法不一样,特作此记录. removeNode方法的功能是删除一个节点,语法为node.removeNode(false)或者node.removeNode(true),返回值是被删除的节点. removeNode(false)表示仅仅删除指定节点,然后这个节点的原孩子节点提升为原双亲节点的孩子节点. removeNode(true)表示删除指定节点及其所有下属节点.被删除的节点成为了孤立节点,不再具有有孩子节点和双亲节点. 重点

当调用List Remove 失效时 [C#] .

有没有试过从一个集合里面移除一个对象之后,这个集合仍然留有这个对象?世界之大,无奇不有.稍有疏忽,便会导致这种奇怪的现象.现在让我们看看这个“不死”对象究竟是怎么一回事. 1.“不死”对象现身 这个问题起初是我一个同事提出的,为了重现“不死”对象,现把代码简化如下: // Code #01IList products = new List<Product>();products.Add(GetProduct("1412"));products.Remove(GetProdu