2

カウンターを使用してリストから何かを削除しようとしていますが、機能しません。

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

なぜこれが機能しないのか誰にも分かりますか?それは私に実行時の例外を与えます:

コレクションが変更されました。列挙操作が実行されない可能性があります。」

4

5 に答える 5

7

Jonasは、これが機能しない理由を説明しましたが、別のオプションを提供すると思いました。

List<T>.RemoveAll1回の呼び出しで一致するすべてのアイテムを削除するために使用できます。

rolls.RemoveAll(rl => rl.getCourseId == courseId && rl.getStudentId == studentId);
于 2012-08-13T23:49:38.427 に答える
5

コレクションを foreach している間は、コレクションを変更することはできません。代わりに通常の for ループ (または while ループ) を使用してみてください。

int i = 0;
while(i < myCollection.Count)
{
  if(removeItem)
    myCollection.RemoveAt(i);
  else
    ++i;
}
于 2012-08-13T23:47:14.777 に答える
1

を使用してコレクションを反復処理するため、コレクションを変更することはできませんforeach

そのようなforループを使用してみてください for(int i = 0; i < rolls.Length; i++) {

于 2012-08-13T23:47:24.060 に答える
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
    }
}
于 2012-08-13T23:49:55.603 に答える
0

ループバックを行う必要があります

for(int i=rolls.Count-1;i>=0;i--)
    if(rolls[i].getCourseId == courseId && rolls[i].getStudentId == studentId)
        rolls.RemoveAt(i)
于 2012-08-14T00:56:17.000 に答える