忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

コレクション「List」と配列の相互変換について

コレクションクラスの List と配列は相互に変換ができます。 「コレクション「List」の使い方について」の記事では配列との変換について記述していませんでしたので、ここでまとめます。


List から配列への変換(ToArray, CopyTo

変換を行う為に ListToArray 関数及び CopyTo メソッドを使いますが、 それぞれの定義は以下の様になります。

メソッド
or 関数
書式説明
ToArray ToArray() As T()
 戻り値:List(Of T) の要素のコピーを格納する配列
List(Of T) の要素を新しい配列にコピーします
CopyTo CopyTo(array() As T)
 array:List(Of T) から要素がコピーされる 1次元の System.Array
    System.Array には、0 から始まるインデックス番号が必要です
List(Of T) 全体を互換性のある1次元の先頭から配列にコピーします
CopyTo CopyTo(array() As T, index As Integer)
 array:List(Of T) から要素がコピーされる 1次元の System.Array
 index:コピーの開始位置で、array 内の 0 から始まるインデックス
 例外:ArgumentOutOfRangeException
 index が 0 未満
 例外:ArgumentException
 List(Of T) の要素数が index からコピー先の array の
 末尾までに格納できる数を超えています
List(Of T) 全体を互換性のある1次元の指定したインデックスから配列にコピーします


以下のソースを見て下さい。ToArray, CopyTo の例を記します。

    Private Sub btnList_Click(sender As Object, e As EventArgs) Handles btnList.Click
        Dim i As Integer = 0
        ' Listの生成(初期化)
        Dim list As New List(Of Integer) From {1, 10, 100, 1000, 10000}
        Dim list2 As New List(Of Integer) From {2, 20, 200}

        ' 配列へ変換
        Dim arr() As Integer
        Console.WriteLine("=== ToArray ===")
        arr = list.ToArray
        For i = 0 To UBound(arr)
            Console.WriteLine("arr({0})の要素:{1}", i, arr(i))
        Next

        ' 配列へのコピー
        Console.WriteLine("=== CopyTo ===")
        list2.CopyTo(arr)
        For i = 0 To UBound(arr)
            Console.WriteLine("arr({0})の要素:{1}", i, arr(i))
        Next

        ' 最初に少ないListデータを配列へ変換
        arr = list2.ToArray
        Try
            ' エラーの起きる配列へのコピー
            list.CopyTo(arr)
        Catch ex As Exception
            Console.WriteLine("CopyToエラー:{0}", ex.Message)
        End Try

        ' 再度listから変換
        arr = list.ToArray
        ' インデックスを指定して配列へのコピー
        Console.WriteLine("=== CopyTo(index) ===")
        list2.CopyTo(arr, 2)
        For i = 0 To UBound(arr)
            Console.WriteLine("arr({0})の要素:{1}", i, arr(i))
        Next
    End Sub

実行結果がコンソールには以下様に表示されます。
10行目の ToArray 関数により「list」から「arr」に変換され、要素がコピーされていることが分かります。 17行目の CopyTo メソッドにより「list2」から「arr」の先頭から要素が上書きコピーされていることが分かります。 「arr」の要素(3),(4)はそのままになっています。
再度「list2」から「arr」に変換し、26行目で要素数の多い「list」を上書きコピーさせています。 「arr」は要素数が足りないので、エラーが発生します。
再度「list」から「arr」に変換し、35行目で2番目の要素から「list2」を上書きコピーさせています。

=== ToArray ===
arr(0)の要素:1
arr(1)の要素:10
arr(2)の要素:100
arr(3)の要素:1000
arr(4)の要素:10000
=== CopyTo ===
arr(0)の要素:2
arr(1)の要素:20
arr(2)の要素:200
arr(3)の要素:1000
arr(4)の要素:10000
CopyToエラー:ターゲット配列の長さが足りません。destIndex、長さ、および配列の最小値を確認してください。
=== CopyTo(index) ===
arr(0)の要素:1
arr(1)の要素:10
arr(2)の要素:2
arr(3)の要素:20
arr(4)の要素:200


List の生成(New)で配列指定

List を生成する時に配列を指定すれば、配列要素をコピーして生成されます。
New の引数として IEnumerator(Of T) が必要なのですが、配列(System.Array)はこれを持っているため、指定ができます。 尚、New の引数として List を用いても同様にできます。
AddRange でも同様に引数に配列を指定することができます。

    Private Sub btnList_Click(sender As Object, e As EventArgs) Handles btnList.Click
        Dim i As Integer = 0
        ' 配列宣言・初期化
        Dim arr() As Integer = {1, 20, 300}

        ' 配列を指定したListの生成
        Console.WriteLine("=== New(配列) ===")
        Dim list As New List(Of Integer)(arr)
        i = 0
        For Each nVal As Integer In list
            Console.WriteLine("{0}番目に取得したListの要素:{1}", i, nVal)
            i += 1
        Next

        ' Listを指定したList2の生成
        Console.WriteLine("=== New(List) ===")
        Dim list2 As New List(Of Integer)(list)
        i = 0
        For Each nVal As Integer In list2
            Console.WriteLine("{0}番目に取得したList2の要素:{1}", i, nVal)
            i += 1
        Next

        ' 配列をListに追加
        Console.WriteLine("=== AddRange ===")
        list.AddRange(arr)
        i = 0
        For Each nVal As Integer In list
            Console.WriteLine("{0}番目に取得したListの要素:{1}", i, nVal)
            i += 1
        Next
    End Sub

結果は以下の通りです。

=== New(配列) ===
0番目に取得したListの要素:1
1番目に取得したListの要素:20
2番目に取得したListの要素:300
=== New(List) ===
0番目に取得したList2の要素:1
1番目に取得したList2の要素:20
2番目に取得したList2の要素:300
=== AddRange ===
0番目に取得したListの要素:1
1番目に取得したListの要素:20
2番目に取得したListの要素:300
3番目に取得したListの要素:1
4番目に取得したListの要素:20
5番目に取得したListの要素:300

関連する記事

コレクション「List」の使い方について
配列の使い方について(Dim, Redim)
配列の使い方の注意点について(コピー, Clone)
配列の範囲指定によるコピー(Array.Copy, Skip, Take)











PR

コメント

コメントを書く