3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C# List(リスト)のコピー

Posted at

0.0 はじめに

List(リスト)を別のListにコピーしたいとき、=(イコール)を使って単純にリストを代入すると参照渡しになってしまうので注意が必要です。

1.0 参照渡し

参照渡しとは、コピー先でも同じListを参照するように渡すことです。 コピーされたListに変更を加えると元のリストにも変更が反映されます。
シャローコピー(Shallow Copy : 浅いコピー)とも言います。

C# Test.cs
List<string> listA = new List<string> {"test"};  
  
// listAの要素を変えるとlistBも一緒に変わる  
List<string> listB = listA;   

2.0 値渡し

上記に対して値のみを渡すのが値渡しです。変更がコピー元に影響しません。
値渡しの方法はいろいろありますが、シンプルなのはListのコンストラクタを使う方法だと思います。
ディープコピー(Deep Copy : 深いコピー)とも言います。

C# Test.cs
List<string> listA = new List<string> {"test"};  
  
// listAを変えてもlistBは変わらない  
List listB = new List(listA); 

3.0 まとめ

試してみた。

C# Test.cs
// Listのコピーのテスト
public class Test : MonoBehaviour
{
    // List作成、List Aには0,1,2を入れている
    List<int> listA = new List<int> {0,1,2};
    List<int> listB = new List<int>();
    List<int> listC = new List<int>();

    private void Start() {
        listB = listA; // 参照渡しでコピー
        listC = new List<int>(listA); // 値渡しでコピー
        // 初期値を表示
        ListCheck(listA, "listA"); // 0,1,2
        ListCheck(listB, "listB"); // 0,1,2
        ListCheck(listC, "listC"); // 0,1,2

        // list Aに99を追加
        listA.Add(99);

        // 現在値を表示
        ListCheck(listA, "listA"); // 0,1,2,99
        ListCheck(listB, "listB"); // 0,1,2,99(99が追加された)
        ListCheck(listC, "listC"); // 0,1,2

        // list Bから1を削除
        listB.Remove(1); 

        // 現在値を表示
        ListCheck(listA, "listA"); // 0,2,99(1が削除された)
        ListCheck(listB, "listB"); // 0,2,99
        ListCheck(listC, "listC"); // 0,1,2
    }

    // コンソール画面に表示するために作ったメソッド
    void ListCheck(List<int> list, string listName) {
        string str = "";
        foreach (var item in list) {
            str += item.ToString() + ", ";
        }
        Debug.Log($"{listName} の中身は {str} です");
    }
}

ListAへの変更がListBへ反映されている、ListCには影響なし
image.png

ListBへの変更がListAへ反映されている、ListCには影響なし
image.png

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?