ProgrammingVB.NETプログラマー(データベース、ビジネスロジック)

Visual BasicにおけるSortedListおよびSortedDictionaryタイプのコレクションを使うためのメカニズムについて説明してください。これらのコレクションの違いは何ですか?特性は何ですか?キーと値を使用する際に注意すべき点は何ですか?

Hintsage AIアシスタントで面接を突破

回答。

問題の背景:

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

主要な特徴:

  • キーによるソート、キーの型はIComparableをサポートする必要があるか、またはコレクション作成時にIComparerを指定する必要があります。
  • SortedListは少量のデータに対してはメモリ効率が良いですが、挿入や削除の操作が頻繁に行われるとSortedDictionaryに比べて効率が劣ります。
  • 重複するキーは許可されていません。既存のキーを追加しようとすると、例外がスローされます。

トリッキーな質問。

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

一般的なエラーとアンチパターン

  • 既存の要素のキーを変更しようとする(不可能)。
  • IComparable/IComparerを実装していないオブジェクトをキーとして追加する。
  • 重複するキーを追加した際の未処理の例外。

実生活の例

ネガティブケース

ユーザーID(userId - キー)と年齢(値)によるユーザーのレジストリをSortedListで実装しました。キーに自分のオブジェクトタイプ(User)を選んだため、IComparableを実装していません。ユーザーを追加する際に予期しない例外が発生します。

利点:

  • すべてが機能していれば、ソートは便利です。

欠点:

  • 挿入しようとするとプログラムがクラッシュします。
  • ユーザーはUserクラスの修正なしには何もできません。

ポジティブケース

キーが整数型(userId)で、比較をサポートするSortedDictionary(Of Integer, User)を使用しています。すべてが適切に機能し、ユーザーIDによるソートがあります。

利点:

  • 高速なソートと検索。
  • IComparableに関するエラーの解消。

欠点:

  • 頻繁な削除/追加には、SortedDictionaryはSortedListよりも少し多くのメモリを使用します(SortedListは大量のデータでの挿入が遅くなります)。