- ベストアンサー
For Each文内でのコレクションの変更について
VB.Net/C# .NET Framework2.0で開発しております。 下記コード例のように、イテレータループ内(For Each文)でのコレクションの変更(要素の削除)ができないため、苦肉の策として下のように削除する予定のものを格納するバッファ(removeList)に一度登録し、その後もう一度ループをまわして実際に削除する、というコードを書いておりますが、分量も多くなり、一時変数なども出てくるため、あまりよいコードとは言えないと思います。 コレクションから特定の条件を満たした要素を削除するための、もうすこしスマートな書き方はないものでしょうか? 宜しくお願いいたします。 Dim removeList as new List(Of TestClass) For Each e as TestClass in targetList If e.IsDummy Then '直接targetList.Remove(o) とはできない removeList.Add(o) End If End For For Each e as TestClass in removeList targetList.Remove(e) End For
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
List(Of T)のRemoveAllで削除したほうがいいかもしれませんよ ' 削除条件を決定する関数を準備 Private Function myCheck( obj as TestClass) as Boolean return obj.IsDummy End Function 呼び出し方 targetList.RemoveAll( AddressOf myCheck ) といった具合にしてやれば IsDummyがTrueになっているアイテムをすべて削除してくれますよ
その他の回答 (1)
- yamada404
- ベストアンサー率56% (9/16)
意図されている事かどうか分かりませんが。。 これでどうですか For i As Integer = 0 To targetList.Count - 1 Dim cls As TestClass = targetList(i) If cls Is Nothing Then Continue For End If If cls.IsDummy Then targetList.Remove(cls) End If Next
補足
ご回答ありがとうございます。 確かにこの方法でもできそうですね。一点、普段コレクションの走査でインデックスループをあまり用いないので、targetListからリアルタイムにRemoveしてしまった後の歯抜けリストの走査は正常に動作するのか不安があります(インデックスがずれたり等)。後で検証してみます。 その他、なるべくならFor Eachループを用いて簡潔な記法で書きたいと考えておりますので、他の方法もありましたら宜しくお願い致します。
お礼
あなた様は本当に神様か何かだと思います。本当にありがとうございました。本当に感謝しています。重ね重ね本当にありがとうございました。