【VB.NET】List の使い方

VB.NET
この記事は約16分で読めます。

概要

コレクションクラスの代表格の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

コメント

タイトルとURLをコピーしました