[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
コレクションクラスの List と配列は相互に変換ができます。 「コレクション「List」の使い方について」の記事では配列との変換について記述していませんでしたので、ここでまとめます。
■List から配列への変換(ToArray, CopyTo)
変換を行う為に List の ToArray 関数及び 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)
コメント