忍者ブログ

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

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

配列の範囲指定によるコピー(Array.Copy, Skip, Take)

配列から範囲を指定して要素を抽出し、新しい配列を作成する方法について記します。
それでは以下の方法を説明したいと思います。

■新規配列を生成し 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.EnumerableSkip メソッドを使うことで、配列内の一連の要素から指定位置から後ろのデータを全て取得します。 更に System.Linq.EnumerableTake メソッドで先頭から指定個数の要素を切出します。

    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

コメント

コメントを書く