VB.NETのSortedList完全解説!自動で並び替える便利なコレクションの使い方
生徒
「VB.NETでデータを保存するとき、追加した瞬間にアイウエオ順や数字の小さい順に並べてくれる方法はありますか?」
先生
「それなら『SortedList(ソーテッドリスト)』というコレクションを使うのがぴったりですよ。」
生徒
「ソーテッドリスト…『ソート(並び替え)されたリスト』ということですね!具体的にはどう使うんですか?」
先生
「バラバラにデータを追加しても、自動で整列してくれる仕組みなんです。基本から見ていきましょう!」
1. SortedList(ソーテッドリスト)とは?
VB.NETのSortedList(ソーテッドリスト)とは、複数のデータを「キー(目印)」と「値(中身)」のペアで管理し、なおかつキーの順番で常に自動的に並び替えてくれる特別な入れ物(コレクション)です。
プログラミング未経験の方にわかりやすく例えると、SortedListは「図書室の本棚」のようなものです。新しい本が届いたとき、適当な場所に置くのではなく、背表紙の名前や番号を見て、決められた場所にきれいに差し込みますよね。このように、データを追加した瞬間に「あるべき場所」へ自動整列してくれるのが、この機能の最大の魅力です。自分で行を入れ替える手間が省けるため、名簿管理やランキング表を作るのに非常に適しています。
2. SortedListの宣言と基本的な作り方
SortedListを使うためには、まず「どんな種類のキーと値を使うか」を決めて、パソコンに準備をさせます。これを宣言と呼びます。VB.NETでは、以前学習したDictionary(辞書)と同じように、(Of キーの型, 値の型)という書き方で指定します。
例えば、商品のID(整数型:Integer)と商品名(文字列型:String)をセットで扱う場合、以下のように記述します。パソコンに「これからSortedListを使うよ!」と伝える大切なステップです。
' 整数(Integer)をキーにして、文字(String)を保存するSortedListを作る
Dim productList As New SortedList(Of Integer, String)()
' データを追加(IDをバラバラな順番で入れてみます)
productList.Add(3, "電子レンジ")
productList.Add(1, "冷蔵庫")
productList.Add(2, "洗濯機")
' 表示してみると、自動的に1, 2, 3の順に並んでいます
For Each pair As KeyValuePair(Of Integer, String) In productList
Console.WriteLine("ID:" & pair.Key & " 商品名:" & pair.Value)
Next
ID:1 商品名:冷蔵庫
ID:2 商品名:洗濯機
ID:3 商品名:電子レンジ
3. なぜ自動で並ぶ?「キー」の役割と注意点
SortedListが自動的に並び替える基準にするのが、ペアの左側に指定する「キー(Key)」です。このキーには、数値だけでなく文字列(名前など)を使うこともできます。文字列をキーにすると、辞書のようにアイウエオ順やアルファベット順に並びます。
ここで初心者が気を付けるべきポイントが一つあります。それは、「同じキーを二つ入れることはできない」というルールです。図書室で全く同じ管理番号の本が二冊あると混乱してしまうのと同じで、プログラムも「どっちが正解?」と迷ってエラーになってしまいます。また、キーの中身が「空っぽ(Nothing)」であることも許されません。この一意性(ユニークさ)を保つことが、SortedListを使いこなすコツです。
4. データの取得と存在チェック(ContainsKey)
保存したデータを取り出すときは、キーを指定するだけでOKです。しかし、もし存在しないキーを指定して取り出そうとすると、プログラムがエラーで止まってしまいます。これを防ぐために、「ContainsKey」という便利な命令を使います。
これは、「このキーはリストの中にありますか?」と尋ねる命令で、あればTrue(はい)、なければFalse(いいえ)という答えが返ってきます。これを制御構造(If文)と組み合わせることで、パソコンがフリーズしたり強制終了したりするのを防ぐ「優しいプログラム」になります。
Dim scoreList As New SortedList(Of String, Integer)()
scoreList.Add("佐藤", 85)
scoreList.Add("阿部", 92)
' 「阿部」さんが登録されているか確認
If scoreList.ContainsKey("阿部") Then
Dim score As Integer = scoreList("阿部")
Console.WriteLine("阿部さんの点数は " & score & " 点です")
End If
阿部さんの点数は 92 点です
5. インデックス(番号)でデータを取り出す
SortedListの面白いところは、Dictionary(辞書)のようにキーで探すだけでなく、配列のように「○番目のデータ」という番号(インデックス)でデータを取り出すこともできる点です。
自動で並び替えられているので、例えば「一番小さいキーを持つデータ(0番目)」や「三番目に大きいデータ(2番目)」といった取得が可能です。これには、Keys(番号)やValues(番号)という書き方を使います。プログラミングでは、数は「0」から数え始めるという基本も忘れないようにしましょう。この機能があるおかげで、ランキングのトップ3だけを抜き出すといった処理も簡単に作れます。
6. データの削除(RemoveとRemoveAt)
不要になったデータを消去する方法は二種類あります。一つはキーを指定して消すRemove、もう一つは何番目かを指定して消すRemoveAtです。どちらも、実行するとそのデータペアがリストから完全に取り除かれ、後ろに並んでいたデータが自動的に前に詰められます。
パソコンのメモリ(作業スペース)をきれいに保つためにも、使わなくなったデータはこまめに消去するのが良い習慣です。ただし、ループ(繰り返し処理)の途中でデータを削除すると、順番がずれてパソコンが混乱することがあるので、慣れるまでは「消してからループを回す」などの工夫が必要です。
Dim members As New SortedList(Of String, String)()
members.Add("C", "会員C")
members.Add("A", "会員A")
members.Add("B", "会員B")
' キー「B」のデータを削除
members.Remove("B")
' 0番目(この場合は一番アルファベットが早いA)を削除
members.RemoveAt(0)
Console.WriteLine("現在の残り人数: " & members.Count)
現在の残り人数: 1
7. SortedListと他のコレクションの使い分け
VB.NETには色々なデータの入れ物がありますが、SortedListを選ぶべきなのはどんな時でしょうか?他のコレクションと比較して特徴を理解しましょう。
| コレクション名 | 並び順 | 得意なこと |
|---|---|---|
| List | 追加した順 | とりあえずデータを貯める、順番を崩さない |
| Dictionary | バラバラ | とにかく高速にデータを探し出す |
| SortedList | キーの順 | 常に見やすく整列させておきたい |
SortedListは、データを追加・削除するたびに「どこに入れるか」を計算して並び替えるため、膨大な数(数十万件など)のデータを扱うときはDictionaryよりも少し時間がかかることがあります。しかし、数百~数千件程度のデータであれば、その便利さを最大限に享受できます。「いつでも整理整頓されている」という安心感を持ってプログラムを作りたいときは、ぜひSortedListを活用してみてください。