問題の背景:
SortedListおよびSortedDictionaryタイプのコレクションは、.NETでキーと値のペアをキーでソートされた形式で便利に保存するために登場しました。これらは、キーによる高速なアクセスが重要で、同時にソートを維持したいときに使用されます。
問題:
これらのコレクション間の誤った選択、不適切な型のキーの使用(IComparableをサポートしない)、および重複するキーの挿入時の動作についての誤った期待が一般的なエラーに関連しています。
解決策:
Visual Basicでは、ソートされたデータを保存するためにSortedList(Of TKey, TValue)およびSortedDictionary(Of TKey, TValue)クラスが使用されます。
コード例:
Dim sortedList As New SortedList(Of String, Integer)() sortedList.Add("Alex", 27) sortedList.Add("Mike", 34) Dim age As Integer = sortedList("Alex") ' 27 Dim sortedDict As New SortedDictionary(Of Integer, String)() sortedDict.Add(3, "Three") sortedDict.Add(1, "One") For Each pair In sortedDict Console.WriteLine(pair.Key & ": " & pair.Value) Next
主要な特徴:
1. SortedListまたはSortedDictionaryの既存要素のキーを変更できますか?
いいえ、既存の要素のキーを変更することはできません。キーを「変更」するには、元のペアを削除し、修正されたキーを持つ新しいペアを追加する必要があります。
2. 既存のキーを追加しようとしたときに発生する例外は何ですか?
ArgumentExceptionがスローされます。
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "One") sl.Add(1, "Repeat") ' ArgumentException
3. キーにIComparableを実装していない型を使用するとどうなりますか?
コンパイラはコレクションを作成することを許可しますが、最初の要素を追加しようとするとInvalidOperationExceptionがスローされます。
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Exception
ユーザーID(userId - キー)と年齢(値)によるユーザーのレジストリをSortedListで実装しました。キーに自分のオブジェクトタイプ(User)を選んだため、IComparableを実装していません。ユーザーを追加する際に予期しない例外が発生します。
利点:
欠点:
キーが整数型(userId)で、比較をサポートするSortedDictionary(Of Integer, User)を使用しています。すべてが適切に機能し、ユーザーIDによるソートがあります。
利点:
欠点: