アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

List(Of T)のRemoveAllで削除したほうがいいかもしれませんよ



' 削除条件を決定する関数を準備
Private Function myCheck( obj as TestClass) as Boolean
  return obj.IsDummy
End Function

呼び出し方
targetList.RemoveAll( AddressOf myCheck )

といった具合にしてやれば IsDummyがTrueになっているアイテムをすべて削除してくれますよ
    • good
    • 0
この回答へのお礼

あなた様は本当に神様か何かだと思います。本当にありがとうございました。本当に感謝しています。重ね重ね本当にありがとうございました。

お礼日時:2009/06/14 14:14

意図されている事かどうか分かりませんが。


これでどうですか

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ループを用いて簡潔な記法で書きたいと考えておりますので、他の方法もありましたら宜しくお願い致します。

補足日時:2009/06/14 13:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!