概要
コレクションクラスの代表格のList<T>クラス(System.Collections.Generic名前空間)を説明します。
同じく複数の値を同時に扱えるの配列に比べて要素数を自由に変えられるのが最大の特徴ですが!
実は、Listクラスの中身は配列で管理されています。つまりListクラスとはリストの皮を被った配列なのですが中で上手いことやってくれているわけです。
List<T>に似たコレクションクラスにArrayListクラス(System.Collections名前空間)がありますが、こちらは、型を指定しない為、なんでも入れる事が出来ます。ただし、入れる型が決まっていて、特に制限がない限りList<T>クラス(System.Collections.Generic名前空間)を使った方が良いです。理由は、処理が早いことと型を指定するため障害になりにくいからです。
内容
宣言・初期化
宣言・初期化の方法は以下の通り。用途によって使い分けます。
'リストの宣言のみ Dim リスト変数名 As List(Of 型名) ' 初期化 リスト変数名 = New List(Of 型名) ' 値設定 リスト変数名.Add("あ") リスト変数名.Add("い") リスト変数名.Add("う") 'リストの宣言 + 初期化 + 初期値設定 Dim リスト変数名 As New List(Of 型名)(New 型名() {"あ", "い", "う"})
要素を取得する
各項目には番号が付いていて「0」から始まります。番号は、インデックス番号または、要素番号といいます。
インデックス番号を指定してアクセスします。
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 Console.WriteLine(list(1)) 'い Console.WriteLine(list(3)) 'エラー(System.ArgumentOutOfRangeException) End Sub End Module
要素をすべて取得する(繰り返し処理)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 'For 文 For i = 0 To list.Count - 1 Console.WriteLine(list(i)) ' あ い うが出力される Next i 'For Each 文 For Each li As String In list Console.WriteLine(li) 'あ い うが出力される Next 'String型しか入らないため 変数 li はString型に決まってるので '取出した要素の型は省略可能 For Each li In list Console.WriteLine(li) 'あ い うが出力される Next End Sub End Module
インデックスを取得する(IndexOfメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 Console.WriteLine(list.IndexOf("あ")) ' 0が出力される Console.WriteLine(list.IndexOf("え")) '-1が出力される End Sub End Module
指定の要素があるか確認する (Containsメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 Console.WriteLine(list.Contains("あ")) ' True Console.WriteLine(list.Contains("え")) ' False End Sub End Module
要素数を取得する (Countプロパティ)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 Console.WriteLine(list.Count) ' 3 list.Add("え") '要素 3番を設定 Console.WriteLine(list.Count) ' 4 End Sub End Module
リストの末尾に要素を追加する(Addメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 For Each li In list Console.WriteLine(li) 'あ い うが出力される Next list.Add("え") '要素 3番を設定 For Each li In list Console.WriteLine(li) 'あ い う えが出力される Next End Sub End Module
位置を指定して要素を追加する(Insertメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 list.Insert(1, "え") '要素 1番を挿入 For Each li In list Console.WriteLine(li) 'あ え い うが出力される Next End Sub End Module
要素を置き換える
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 list(1) = "え" '要素 1番を置き換える For Each li In list Console.WriteLine(li) 'あ え うが出力される Next End Sub End Module
まとめて要素を追加する(AddRangeメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) Dim arr As String() = {"あ", "い", "う"} list.AddRange(arr) For Each li In list Console.WriteLine(li) 'あ い うが出力される Next list.AddRange(Nothing) 'これはエラー 'System.ArgumentNullException: 値を Null にすることはできません。 End Sub End Module
要素を削除する-インデックスを指定(RemoveAtメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 list.RemoveAt(1) '要素 1番削除 For Each li In list Console.WriteLine(li) 'あ うが出力される Next End Sub End Module
要素を削除する-値を指定(Removeメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 list.Add("い") '要素 3番を設定 list.Remove("い") '要素 "い"を削除 For Each li In list Console.WriteLine(li) 'あ う いが出力される '要素 3番はそのまま Next End Sub End Module
要素を削除する-範囲を指定(RemoveRangeメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 list.Add("え") '要素 3番を設定 list.RemoveRange(1, 2) '要素 1~2番を削除 For Each li In list Console.WriteLine(li) 'あ えが出力される Next 'これはエラー list.RemoveRange(2, 1) 'エラー System.ArgumentException End Sub End Module
要素をすべて削除する(Clearメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 list.Add("え") '要素 3番を設定 list.Clear() '要素を全部削除 Console.WriteLine(list.Count) '0 が出力される End Sub End Module
要素を逆順にする(Reverseメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 list.Reverse() '要素逆にする For Each li In list Console.WriteLine(li) 'う い あ が出力される Next End Sub End Module
リストの中にリストを入れる
Module Module1 Sub Main() ' Listを受け取る Dim allList As New List(Of List(Of String)) 'Stringを受け取る Dim list1 As New List(Of String) list1.Add("あ") '要素 0番を設定 list1.Add("い") '要素 1番を設定 List1.Add("う") '要素 2番を設定 'Stringを受け取る Dim list2 As New List(Of String) list2.Add("A") '要素 0番を設定 list2.Add("B") '要素 1番を設定 list2.Add("C") '要素 2番を設定 allList.Add(list1) allList.Add(list2) Console.WriteLine(allList.Count) ' 2 が出力される 'For Each 文 For Each list In allList For Each li In list Console.WriteLine(li) 'あ い う A B C が出力される Next Next Console.WriteLine(allList(0)(0)) 'あ が出力される Console.WriteLine(allList(1)(1)) 'B が出力される End Sub End Module
リストから配列に変換する(ToArrayメソッド)
Module Module1 Sub Main() Dim list As New List(Of String) list.Add("あ") '要素 0番を設定 list.Add("い") '要素 1番を設定 list.Add("う") '要素 2番を設定 Console.WriteLine(list.GetType) 'System.Collections.Generic.List`1[System.String] Dim arr = list.ToArray() Console.WriteLine(arr.GetType) 'System.String[] 'arr.Add("え") 配列なので、Add 出来ない For Each st In arr Console.WriteLine(st) 'あ い う と出力される Next End Sub End Module
配列からリストに変換する(ToListメソッド)
Module Module1 Sub Main() Dim arr = {"あ", "い", "う"} Console.WriteLine(arr.GetType) 'System.String[] Dim list = arr.ToList list.Add("え") Console.WriteLine(list.GetType) 'System.Collections.Generic.List`1[System.String] For Each li In list Console.WriteLine(li) 'あ い う えと出力される Next End Sub End Module
よく見るエラー
最後にリストを扱う上でよくあるエラーを紹介します。
System.ArgumentOutOfRangeException
System.InvalidOperationException
System.ArgumentNullException
中でもインデックス指定が間違っているため起こる System.ArgumentOutOfRangeException は、コンパイルエラーにもならないしデータしだいでは、問題なく動いたりするのでコーディング中は、気が付きにくいです。
Module Module1 Sub Main() 'リストの宣言 + 初期値セット Dim list = New List(Of String)(New String() {"あ", "い", "う"}) Console.WriteLine(list(3)) 'System.ArgumentOutOfRangeException 'インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 '原因:要素番号の指定が範囲外 For Each li As String In list list(0) = ("え") 'System.InvalidOperationException: 'コレクションが変更されました。列挙操作は実行されない可能性があります。 '原因:For Eachのループ中に要素内容を変えようとした。 Next Dim list1 As List(Of String) list.AddRange(list1) 'System.ArgumentNullException: '値を Null にすることはできません。 '原因:未初期化のコレクションを追加しようとした End Sub End Module
コメント