-1

私は以下のコードを持っています。レコードを削除しようとしていますが、レコードを削除するときに例外がスローされます。コレクションが変更されました。列挙操作が実行されない可能性があります。」

メッセージを取り除く方法に関するアイデア。あなたの時間を感謝します。

//validClaimControlNo has valid ClaimControl Numbers.
List<string> validClaimControlNo = new List<string>();

int count = 0;
foreach (List<Field> f in records)
{
    foreach (Field fe in f)
    {
        if (i == 0)
            if (!(validClaimControlNo.Contains(fe.Value)))
            {
                //if this claim is not in the Valid list, Remove that Record
                records.RemoveAt(count);
            }
        i++;
    }
    i = 0;
    count++;
}
4

3 に答える 3

4

繰り返し処理しているコレクションからアイテムを削除することはできません。追加.ToList()すると、新しいリストが作成され、機能するようになります。

 foreach (List<Field> f in records.ToList())

別の方法は、コレクションを逆方向に繰り返すことです(追加のリストは必要ありません)。

for(int i = records.Count - 1; i >= 0; i--)
{
   var f = records[i];

しかし、コードを見ると、大幅に簡略化できます。

//Put the claim numbers into a set for fast lookup
var set = new HashSet<string>(validClaimControlNo);

//Remove undesired items
records.RemoveAll(f => f.Count > 0 && !set.Contains(f[0].Value));
于 2012-10-04T21:18:39.577 に答える
2

次のように変更foreachします。

foreach (List<Field> f in records.ToList())

于 2012-10-04T21:18:22.813 に答える
1

コレクションを逆方向に繰り返すのが、これを行う最も速い方法です。

for (int i = records.Count - 1; i >= 0; i--) { ... }
于 2012-10-04T22:07:15.000 に答える