2017-12-30 51 views
-5

私のプロジェクトは、クラスのアカウントと2つの子クラス(当座預金口座)です。私のC#プロジェクトのSystem.InvalidOperationException

主に私が口座 の配列リストを作成したが、私はこの方法でオブジェクトを削除しようとしている:

public static void Remove(ArrayList L, int accnb) 
    { 
     foreach(Account obj in L) 
     { 
      if(obj.AccN == accnb) 
       L.Remove(obj); 
     } 
    } 

が、私はエラーを得た:コレクションが変更されました。列挙操作が実行されないことがあります。

追加または戻り文字列のような他のすべての方法がうまく働いた。..

答えて

0

foreachでコレクションを反復処理しながら、要素を削除しないでください。

また、ArrayListではなくList<T>を使用することをおすすめします。 ArrayList

public static void Remove(List<Account> L, int accnb) => 
          L.RemoveAll(obj => obj.AccN == accnb); 
0

項目がobjectとして入力されています

手元のタスクを解決する簡単な方法は、単純に行うことです。したがって、C#は、彼らがAccNという名前のメンバーを持っていることを知らない。

List<T>という名前のArrayListの一般的な型があります。あなたは、派生クラスCurrentAccountDepositAccountのオブジェクトを含めることができ

List<Account> accounts = new List<Account>(); 

このリストを使用してリストを作成するときにここでは、明示的にリスト項目の種類を指定します。このように使用してください

public static void Remove(List<Account> L, int accnb) 
{ 
    foreach(Account acc in L) 
    { 
     if(acc.AccN == accnb) 
      L.Remove(acc); 
    } 
} 

注:C#1.0およびC#1.1ではジェネリックはありませんでした。したがって、弱い型指定のコレクションArrayListが実装されました。ジェネリックはC#2.0で導入されたので、このタイプはほとんど廃止されています。あなたはまた別の問題を抱えていることが

if(((Account)acc).AccN == accnb) 

を動作させるために右の型にオブジェクトをキャストする必要がありますArrayList

foreachで列挙するコレクションを変更することはできません。これは、foreachが混乱するためです。代わりにfor-loopを使用し、項目を削除するときに項目のインデックスを先に変更しないように逆順にループするようにしてください。

for (int i = L.Count - 1; i >= 0; i--) { 
    if (L[i].AccN == accnb) { 
     L.RemoveAt(i); 
    } 
} 

C# Referenceは言う:

foreach文は、必要な情報を取得するためにコレクションを反復処理するために使用され、これにソースコレクションから項目を追加または削除するために使用することはできません予期しない副作用を避ける。ソースコレクションにアイテムを追加または削除する必要がある場合は、forループを使用します。

+0

ah okk原因リストが機能しない、エラーが発生しました型または名前空間の名前 'List'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?) –

+0

'using System.Collections.Genericあなたのコードの上部にあるか、あなたのためにそれを行う電球を使用してください。 –

+0

それは動作しません:/私はそれの上で答えを試してみましたが、私にとっては新しいです –

0

foreachは実際にはコレクションでは機能しませんが、Enumeratorsです。すべてのコレクションが暗黙的に列挙子に変換可能ですが、Enumeartor規則は引き続き適用されます。

だから基本的にはあなたのコードは次のように解釈されます。

temp IEnumerator = L.GetEnumerator(); 
 
foreach(Account obj in temp)

すべての列挙子は、あなた基になるコレクションを変更することはできませんルールを持っています。そうすることで、列挙子が無効になります。 .Current()の次の呼び出しを除いて、スローされます。

列挙子を使用してコレクションを変更することはできず、foreachはフードの下にある列挙子のみを使用するため、foreachを使用しているときにcolelciton(要素の削除を含む)を変更することはできません。これを行うには、はるかに多くのループを必要とします。

関連する問題