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);
}