从列表中删除某些内容

时间:2012-08-13 23:46:06

标签: c#

我正在尝试使用计数器从列表中删除某些内容,但它对我不起作用。

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

任何人都可以理解为什么这可能不起作用。它给了我一个运行时例外:

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

5 个答案:

答案 0 :(得分:7)

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

您可以使用List<T>.RemoveAll删除一次通话中的所有匹配项目:

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

答案 1 :(得分:5)

在您通过它进行预习时,无法修改集合。尝试使用常规for循环(或while循环):

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

答案 2 :(得分:1)

使用foreach进行迭代时,无法修改集合。

尝试使用for循环 for(int i = 0; i < rolls.Length; i++) {

答案 3 :(得分:0)

集合上的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
    }
}

答案 4 :(得分:0)

你应该做一个环回

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