忍者ブログ

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

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

コレクション「Dictionary」から配列及び List への変換について

コレクションクラスの Dictionary は内部的にキー(Keys)と要素(Values)を別々のコレクションとして持っているので、 それぞれ個別に配列に変換ができます。


Dictionary のキー・要素から配列及び List への変換(ToArray, ToList

Dictionary のキー(Keys)及び要素(Values)はコレクションとして保持されていて、 そのコレクションとして以下の様なメソッドがあります。

メソッド or
プロパティ
書式説明
ToArray ToArray() As T()
戻り値:
 コレクションの内容をそのデータ型の一次元配列を返す
コレクションの内容を配列として返す
ToList ToList() As List(Of T)
戻り値:
 コレクションの内容を List コレクションとして返す
コレクションの内容をList コレクションとして返す
Count Count As Integer  (これはプロパティ) コレクションに存在する要素の数を取得します
CopyTo CopyTo(array() As T, index As Integer)
 array:コレクションから要素がコピーされる 1次元の System.Array
 index:コピーの開始位置で、array 内の 0 から始まるインデックス
 例外:ArgumentOutOfRangeException
 index が 0 未満
 例外:ArgumentException
 コレクションの要素数が index からコピー先の array の
 末尾までに格納できる数を超えています
コレクション全体を互換性のある1次元の指定したインデックスから配列にコピーします


以下のソースを見て下さい。ToArray, ToList の例を記します。
配列からの要素取得は通常の For で直接要素を指標で指定し、 List の場合には For Each で順次要素を取得します。

    Private Sub btnList_Click(sender As Object, e As EventArgs) Handles btnList.Click
        Dim i As Integer = 0
        ' Dictionaryの生成(初期化)
        Dim dic As New Dictionary(Of String, String) From _
                    {{"USA", "America"}, {"CHN", "China"}, {"JPN", "Japan"}}

        ' Values(要素の値)を配列へ変換
        Dim arrVal() As String
        Console.WriteLine("=== Values : ToArray ===")
        arrVal = dic.Values.ToArray()
        For i = 0 To UBound(arrVal)
            Console.WriteLine("arrVal({0})の要素:{1}", i, arrVal(i))
        Next

        ' Values(要素の値)を配列へのコピー
        Console.WriteLine("=== Values : ToList ===")
        Dim listV As List(Of String) = dic.Values.ToList
        i = 0
        For Each Str As String In listV
            Console.WriteLine("{0}番目の要素:{1}", i, Str)
            i += 1
        Next

        ' Keys(キーの値)を配列へ変換
        Dim arrKey() As String
        Console.WriteLine("=== Keys : ToArray ===")
        arrKey = dic.Keys.ToArray
        For i = 0 To UBound(arrKey)
            Console.WriteLine("arrKey({0})の要素:{1}", i, arrKey(i))
        Next

        ' Keys(キーの値)を配列へのコピー
        Console.WriteLine("=== Keys : ToList ===")
        Dim listK As List(Of String) = dic.Keys.ToList
        i = 0
        For Each Str As String In listV
            Console.WriteLine("{0}番目の要素:{1}", i, Str)
            i += 1
        Next
    End Sub

実行結果がコンソールには以下様に表示されます。

=== Values : ToArray ===
arrVal(0)の要素:America
arrVal(1)の要素:China
arrVal(2)の要素:Japan
=== Values : ToList ===
0番目の要素:America
1番目の要素:China
2番目の要素:Japan
=== Keys : ToArray ===
arrKey(0)の要素:USA
arrKey(1)の要素:CHN
arrKey(2)の要素:JPN
=== Keys : ToList ===
0番目の要素:USA
1番目の要素:CHN
2番目の要素:JPN


Dictionary のメソッド CopyTo について

CopyTo メソッドは指定した配列のインデックスからコレクションをコピーします。
以下の例では、最初のディクショナリを ToArray により配列に変換後、2番目のディクショナリをその配列の直後にコピーしています。 コピーする前に配列の要素数を拡張しています。

    Private Sub btnList_Click(sender As Object, e As EventArgs) Handles btnList.Click
        Dim i As Integer = 0
        ' Dictionaryの生成(初期化)
        Dim dic As New Dictionary(Of String, String) From _
                    {{"USA", "America"}, {"CHN", "China"}, {"JPN", "Japan"}}
        Dim dic2 As New Dictionary(Of String, String) From _
                    {{"FRA", "France"}, {"IRL", "Ireland"}, {"THA", "Thailand"}, {"BTN", "Bhutan"}}

        ' Values(要素の値)を配列へ変換
        Dim arrVal() As String
        Console.WriteLine("=== Values : ToArray ===")
        arrVal = dic.Values.ToArray()
        For i = 0 To UBound(arrVal)
            Console.WriteLine("arrVal({0})の要素:{1}", i, arrVal(i))
        Next

        ' Values(要素の値)を配列へのコピー
        Console.WriteLine("=== Values : CopyTo ===")
        Dim idxMax As Integer = UBound(arrVal)
        ReDim Preserve arrVal(idxMax + dic2.Values.Count)
        dic2.Values.CopyTo(arrVal, idxMax + 1)
        For i = 0 To UBound(arrVal)
            Console.WriteLine("arrVal({0})の要素:{1}", i, arrVal(i))
        Next


        ' Keys(要素の値)を配列へ変換
        Dim arrKey() As String
        Console.WriteLine("=== Keys : ToArray ===")
        arrKey = dic.Keys.ToArray
        For i = 0 To UBound(arrKey)
            Console.WriteLine("arrKey({0})の要素:{1}", i, arrKey(i))
        Next

        ' Values(要素の値)を配列へのコピー
        Console.WriteLine("=== Keys : CopyTo ===")
        idxMax = UBound(arrKey)
        ReDim Preserve arrKey(idxMax + dic2.Keys.Count)
        dic2.Keys.CopyTo(arrKey, idxMax + 1)
        For i = 0 To UBound(arrKey)
            Console.WriteLine("arrKey({0})の要素:{1}", i, arrKey(i))
        Next
    End Sub

結果は以下の通りです。

=== Values : ToArray ===
arrVal(0)の要素:America
arrVal(1)の要素:China
arrVal(2)の要素:Japan
=== Values : CopyTo ===
arrVal(0)の要素:America
arrVal(1)の要素:China
arrVal(2)の要素:Japan
arrVal(3)の要素:France
arrVal(4)の要素:Ireland
arrVal(5)の要素:Thailand
arrVal(6)の要素:Bhutan
=== Keys : ToArray ===
arrKey(0)の要素:USA
arrKey(1)の要素:CHN
arrKey(2)の要素:JPN
=== Keys : CopyTo ===
arrKey(0)の要素:USA
arrKey(1)の要素:CHN
arrKey(2)の要素:JPN
arrKey(3)の要素:FRA
arrKey(4)の要素:IRL
arrKey(5)の要素:THA
arrKey(6)の要素:BTN

関連する記事

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











PR

コメント

コメントを書く