2008.09.19 Friday
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されていない」という事象に出会ったのですが、そのコード(判りやすくするためにかなり簡略化しています)。
この問題箇所で返値を見てみると、FALSEになっている訳です。
で、これをこんな風に直してみました。
各メンバが全く同じオブジェクトを作って、それに「替え玉」させようったって、それはいけませんよ−という例でした。
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する。これは動く。
各メンバが全く同じオブジェクトを作って、それに「替え玉」させようったって、それはいけませんよ−という例でした。






















