C#の配列をコピーする方法

Cloneメソッド

Cloneメソッドを使うと簡単に配列のコピーができます。

使い方は次のような感じです。

using System;

public class Example1
{
  static public void Main ()
  {
    string[] ar1 = { "aaa", "bbb", "ccc" };
    string[] ar2 = (string[])ar1.Clone();

    ar2[0] = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);
    
    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
aaa
bbb
ccc
ar2:
AAA
bbb
ccc

多次元配列

多次元配列でも同様にCloneできます。

using System;

public class Example2
{
  static public void Main ()
  {
    string[,] ar1 = { {"aaa", "bbb"}, {"ccc", "ddd"} };
    string[,] ar2 = (string[,])ar1.Clone();

    ar2[0,0] = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);
    
    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
aaa
bbb
ccc
ddd
ar2:
AAA
bbb
ccc
ddd

shallow copy

Cloneメソッドは便利ですが、deep copyではなくshallow copyになっている点には注意してください。

using System;

public class C
{
  public string s;
  public override string ToString() => s;
}

public class Example3
{
  static public void Main ()
  {
    C c = new C();
    c.s = "aaa";
	
    C[] ar1 = { c, c };
    C[] ar2 = (C[])ar1.Clone();

    ar2[0].s = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);

    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
AAA
AAA
ar2:
AAA
AAA

リンク

Array.Clone Method (System) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.array.clone?view=netcore-3.1

コメントを残す

メールアドレスが公開されることはありません。