List(Of T).Remove で要素が見つからなかった時

List(Of T) でも、Dictionary(Of TKey,TValue) でも、要素を削除するのに Remove メソッドを使う訳ですが、その要素が見つからなかった場合でも、Exception は Throw されません。
Microsoft.VisualBasic.Collection.Remove や System.Collections.SortedList.Remove は Exception を投げてくれます。
その代わりに、動作結果を Boolean で返却してくれます-削除すべき要素が無かったら、”FALSE”を返してくれます。
( System.Collections.ArrayList は何も返してくれません。)
なので、List(Of T) や Dictionary(Of TKey,TValue)で「きちんと削除されたか確認したい」場合には、返値を判断することになります。
なんでこんなことを書いているのか。先日、「RemoveしているはずなのにRemoveされていない」という事象に出会ったのですが、そのコード(判りやすくするためにかなり簡略化しています)。

[VB.NET]
‘HogeCollection は List(Of Hoge)
Dim lstHoge As New HogeCollection
lstHoge.Add(New Hoge(“1″,”1″))
lstHoge.Add(New Hoge(“2″, “2”))
‘中略…
lstHoge.Remove(New Hoge(“1″,”1″))
‘↑
‘ここが問題箇所:Remove されません

この問題箇所で返値を見てみると、FALSEになっている訳です。
で、これをこんな風に直してみました。
[VB.NET]
‘HogeCollection は List(Of Hoge)
Dim lstHoge As New HogeCollection
lstHoge.Add(New Hoge(“1″,”1″))
lstHoge.Add(New Hoge(“2″, “2”))
‘中略…
lstHoge.Remove(lstHoge.Item(“1″,”1″))
‘↑
‘中から探し出してきてRemoveする。これは動く。

各メンバが全く同じオブジェクトを作って、それに「替え玉」させようったって、それはいけませんよ-という例でした。

List(Of T).Remove で要素が見つからなかった時” への1件のコメント

  1. Removeメソッドの戻り値がBooleanなあたり、なんか懐かしいというか、なんというか・・・。
    先祖返りな感じがして、「それは、ちょっとどうなの?」と言いたくなります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree