2020年09月25日
川俣晶の縁側ソフトウェアC# コーディング How To total 903 count

【入門級】配列を複製する4つの方法

Written By: 川俣 晶連絡先

配列の複製はどうするか §

 配列そのものを複製する方法はいろいろあります。

 サンプルソースには4つの方法を紹介しています。

 正攻法はもう1つ配列を作ってから値をコピーしています。全ての値をコピーするためにループが必要です。

 Copy法はCopyメソッドで値の複写を一括で行う方法です。ループは要らなくなります。

 Clone法はCloneメソッドでオブジェクトの複製を作ります。しかしキャストが必要です。

 ToArray法はLINQが使える場合は最も簡単です。一般的にToArrayメソッドは列挙型を配列に置き換えるメソッドとして使われますが、配列に対して使うと同じ内容で新しい配列を作ってくれます。配列も列挙型の一種として振る舞うからです。

罠の数々 §

  • 配列を代入しても配列への参照が複製されるだけで配列は増えません!
  • 参照型オブジェクトの配列の場合、参照が増えるだけで参照されたオブジェクトまで複製されるわけではない。増えるのは配列だけである。

参考リンク §

Array.Copy メソッド

Array.Clone メソッド

Enumerable.ToArray<TSource>(IEnumerable<TSource>) メソッド

 なぜ、Cloneメソッドを使ったときだけキャストが必要なのだろうか。上記のリンクから理由と確かめてみよう。

 また、上記のリンクをから、同じArrayクラスなのにCopyメソッドでキャストは要らなかった理由を考えてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

ArrayDuplicate §

using System;

using System.Linq;

class Program

{

    static void Main()

    {

        // 元データ

        int[] array1 = { 1, 2, 3 };

        // 正攻法

        int[] array2 = new int[array1.Length];

        for (int i = 0; i < array1.Length; i++) array2[i] = array1[i];

        Console.WriteLine($"array2={array2[0]},{array2[1]},{array2[2]}");

        // Copy法

        int[] array3 = new int[array1.Length];

        Array.Copy(array1, array3, array1.Length);

        Console.WriteLine($"array3={array3[0]},{array3[1]},{array3[2]}");

        // Clone法

        int[] array4 = (int[])array1.Clone();

        Console.WriteLine($"array4={array4[0]},{array4[1]},{array4[2]}");

        // ToArray法

        int[] array5 = array1.ToArray();

        Console.WriteLine($"array5={array5[0]},{array5[1]},{array5[2]}");

    }

}

実行結果

array2=1,2,3

array3=1,2,3

array4=1,2,3

array5=1,2,3

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?