从列表中删除某些东西

问题描述:

我试图使用计数器从列表中删除某些内容,但它不适用于我。从列表中删除某些东西

int i =0; 
    foreach(Rolls rl in rolls) 
    { 
     if(rl.getCourseId == courseId && rl.getStudentId == studentId) 
     { 
      rolls.RemoveAt(i) ; 
     } 
     i++; 
    } 

任何人都可以看到为什么这可能无法正常工作。它给我一个运行时异常:

“收集已修改;枚举操作可能无法执行。”

+0

迭代通过循环向后 – user959631 2012-08-13 23:50:21

在对其进行透视时,您无法修改集合。尝试使用常规的for循环,而不是(或while循环):

int i = 0; 
while(i < myCollection.Count) 
{ 
    if(removeItem) 
    myCollection.RemoveAt(i); 
    else 
    ++i; 
} 
+0

这也不行,因为你删除项目,指标的变化,你会移除错误项目。 – 2012-08-13 23:52:54

+3

不,这就是为什么你只增加我,如果你不删除的东西。 – Jonas 2012-08-13 23:53:44

+0

现在你把例子放在......是的,这会起作用,但很尴尬。 – 2012-08-13 23:56:10

,你通过它迭代与foreach您不能修改的集合。

尝试使用一个for循环,像这样 for(int i = 0; i < rolls.Length; i++) {

Jonas explained why this won't work,但我想我会提供另一种选择。

您可以使用List<T>.RemoveAll去除一个呼叫所有符合条件的物品:

rolls.RemoveAll(rl => rl.getCourseId == courseId && rl.getStudentId == studentId); 

foreach所收集不喜欢你的工作。试试这个:

for (int x = 0; x < rolls.Count; x++) 
{ 
    if(rolls[x].getCourseId == courseId && rolls[x].getStudentId == studentId) 
    { 
     rolls.RemoveAt(x); 
     --x; //since we removed an item, the index needs to be updated accordingly 
    } 
} 
+2

这也不是很有效,因为你的索引会搞砸。删除后,你需要一个--x。 – Jonas 2012-08-13 23:53:03

+0

+1用于解决我不小心的错误。谢谢乔纳斯。 – Sam 2012-08-14 00:00:13

+0

你应该反转循环 – S3ddi9 2012-08-14 00:59:00

你应该做一个loopback

for(int i=rolls.Count-1;i>=0;i--) 
    if(rolls[i].getCourseId == courseId && rolls[i].getStudentId == studentId) 
     rolls.RemoveAt(i)