×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
配列から範囲を指定して要素を抽出し、新しい配列を作成する方法について記します。
それでは以下の方法を説明したいと思います。
■新規配列を生成し Array.Copy でコピー
Array.Copy の引数の説明は以下の通りです。
Array.Copy(sourceArray As System.Array, sourceIndex As Integer, destinationArray As System.Array, destinationIndex As Integer, length As Integer) ・sourceArray :コピー元の配列データ。 ・sourceIndex :コピー操作の開始位置となる sourceArray 内のインデックスを表す 32 ビット整数。 ・destinationArray:コピー先の配列データ。 ・destinationIndex:格納を開始する destinationArray のインデックスを表す 32 ビット整数。 ・length :コピーする要素の数を表す 32 ビット整数。
以下のソースを見て下さい。 最初にコピー元配列「arr」を宣言し、コピー先の配列「arr2」をコピー数で領域確保しています。 今回の処理ではコピー元の位置を「6」として3個の要素をコピーしています。
Private Sub btnArray_Click(sender As Object, e As EventArgs) Handles btnArray.Click '配列宣言(初期化) Dim arr() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 'コピー元の位置 Dim iPos As Integer = 6 'コピー先で3個の要素 Dim nLen As Integer = 3 Dim arr2(nLen - 1) As Integer 'コピー Array.Copy(arr, iPos, arr2, 0, nLen) 'コピー先の結果表示 Dim i As Integer = 0 For Each nEnt As Integer In arr2 Console.WriteLine("arr2({0}):{1}", i, nEnt) i += 1 Next End Sub
実行結果がコンソールには以下様に表示されます。確かにコピーされている様です。
arr2(0):6 arr2(1):7 arr2(2):8
この処理を関数に以下の様にまとめてみました。
'''''' 配列切出し ''' ''' <param name="arr">切出し元の配列</param> ''' <param name="iPos">切出し位置</param> ''' <param name="nLen">要素数</param> '''切出した配列を返す Function SliceArray(ByVal arr() As Integer, ByVal iPos As Integer, ByVal nLen As Integer) As Integer() '指定位置が配列の大きさを超えた? If iPos >= arr.Length Then Return {} End If 'コピー最終位置 Dim iLast As Integer = iPos + nLen - 1 '指定位置からの指定個数が配列の大きさを超えた? If iLast >= arr.Length Then '個数の調整 nLen = arr.Length - iPos End If '返す配列の生成 Dim arrRet(nLen - 1) As Integer 'コピー Array.Copy(arr, iPos, arrRet, 0, nLen) '配列を返す Return arrRet End Function
■配列を Enumerable.Skip、Enumerable.Take メソッドで処理
System.Linq.Enumerable の Skip メソッドを使うことで、配列内の一連の要素から指定位置から後ろのデータを全て取得します。 更に System.Linq.Enumerable の Take メソッドで先頭から指定個数の要素を切出します。
Private Sub btnArray_Click(sender As Object, e As EventArgs) Handles btnArray.Click '配列宣言(初期化) Dim arr() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 'コピー '「arr」の先頭から6個の要素をスキップしてそれ以降を配列生成 Dim arr2() As Integer = System.Linq.Enumerable.Skip(arr, 6).ToArray '「arr2」の先頭から3個の要素のみで配列生成 arr2 = System.Linq.Enumerable.Take(arr2, 3).ToArray '以下の様に連結しても同様!! 'Dim arr2() As Integer = arr.Skip(6).Take(3).ToArray 'コピー先の結果表示 Dim i As Integer = 0 For Each nEnt As Integer In arr2 Console.WriteLine("arr2({0}):{1}", i, nEnt) i += 1 Next End Sub
関連する記事
⇒配列の使い方について(Dim, Redim)⇒配列の使い方の注意点について(コピー, Clone)
PR
コメント