C# 在遍历列表的浅层副本时从列表中删除
我知道在遍历列表时从列表中删除不是一个好主意,但是在从原始列表中删除的同时获取它的浅拷贝并遍历它怎么样 例如:C# 在遍历列表的浅层副本时从列表中删除,c#,.net,list,C#,.net,List,我知道在遍历列表时从列表中删除不是一个好主意,但是在从原始列表中删除的同时获取它的浅拷贝并遍历它怎么样 例如: public class myClass { public int id { get; set; } public string name { get; set; } } List<myClass> list = new List<myClass>(); // getting a shallow copy with FindAll List&
public class myClass
{
public int id { get; set; }
public string name { get; set; }
}
List<myClass> list = new List<myClass>();
// getting a shallow copy with FindAll
List<myClass> copy = list.FindAll(e => e.id > 10);
for (int i = 0; i < copy.Count; i++)
{
// do stuff with copy[i]
list.RemoveAll(e => e.id == copy[i].id);
}
公共类myClass
{
公共int id{get;set;}
公共字符串名称{get;set;}
}
列表=新列表();
//与芬德尔取得一份浅显的副本
List copy=List.FindAll(e=>e.id>10);
for(int i=0;ie.id==copy[i].id);
}
如果copy
只是指向列表元素的指针列表,那么从原始列表中删除后,指针将指向副本中的什么?更简单(更短):
LINQ ToList()动态创建临时副本
只要您使用与索引不同的内容(如示例中的ID)访问列表元素,就不必担心索引的更改。从原始列表中删除项目时,您不是从内存中删除项目,而是从列表中删除项目,它们仍在内存中,
copy
有对它们的引用
例如,考虑到你是一个学校的学生,你正在上数学和物理课,如果数学老师把你从他班的学生名单中删除,你仍然在物理班的学生名单中,你仍然是那个学校的学生。
list
和copy
都有对内存中某些项的引用,您只需添加和删除对它们的引用即可。如果删除对内存中某个项的所有引用,则垃圾收集器将从内存中删除该项。就像如果你不参加学校的任何课程,那么你就不再是那个学校的学生了 您也可以进行反向迭代,这样可以保持索引的完整性,但这对LINQ不是很友好。您要删除的每个项目都要调用RemoveAll
一次。那没有真正的意义。只需调用RemoveAll
一次即可删除所有项目<代码>列表.RemoveAll(item=>item.id>10)代码>你就完成了。@Servy我不能,首先我需要处理我要删除的项目。RemoveAll实际上处于if条件内。
foreach (var element in list.ToList())
{
// do stuff with copy[i]
list.RemoveAll(e => e.id == element.id);
}