1

こんにちは、arrayList から 2 で割り切れるすべての数値を削除しようとしています。問題は、1 つの要素が削除された後に InvalidOperationException が発生することです。

   private ArrayList RemoveDivTwo(ArrayList list) {
        int count = 0;
        foreach(int i in list){
            if ((i > 2) && (i % 2 == 0)) {
                list.RemoveAt(count); 
            }
            count++;
        }

        return list;
    }

この問題を解決して、例外が発生せず、2 で割り切れるすべての要素を削除できるようにするにはどうすればよいですか?

4

3 に答える 3

3

このように繰り返してみてください。

for(int i = 0; i < list.Count(); i++){
   if ((list[i] > 2) && (list[i] % 2 == 0)) {
                list.RemoveAt(i); 
                i--; //as offsets have shifted by one due to removal
            }
}

リストを繰り返し処理する必要はなくなりました。したがって、これは機能するはずです。

于 2012-10-20T11:13:20.793 に答える
1

foreachループは、アイテムのリストの反復を開始する前にcollectionName.GetEnumeratorメソッドを呼び出すため、例外がスローされます。コレクションで新しいforeachループを開始しない限り、GetEnumeratorは再度呼び出されません。リストはforeachループ内で変更できません。これは、リストの読み取り専用操作のみを対象としています。

リストの要素を反復および変更するためにforループを使用できます。

于 2012-10-20T11:36:47.223 に答える
1

要素を削除することさえ気にしません。必要な要素を新しいリストとして返すだけです。

List<int> RemoveDivTwo(List<int> list) {
    return list.Where(i => i % 2 == 1 || i <= 2).ToList();
}
于 2012-10-20T14:04:28.593 に答える