C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でArrayListのシャローコピー(浅いコピー)を作成する方法

C#でArrayListのシャローコピー(浅いコピー)を作成するには、Clone()メソッドを使用します。Cloneメソッドは、元のArrayListと同じ要素を持つ新しいArrayListインスタンスを返します。ただし、要素そのものは複製されず、元のリストと同じオブジェクトへの参照が共有されるため、「シャローコピー(浅いコピー)」と呼ばれます。

サンプルコード1

以下は、Cloneメソッドを使ってArrayListのシャローコピーを作成する例です。

using System;
using System.Collections;
public class Demo {
   public static void Main(){
      ArrayList list = new ArrayList();
      list.Add("One");
      list.Add("Two");
      list.Add("Three");
      list.Add("Four");
      list.Add("Five");
      list.Add("Six");
      list.Add("Seven");
      list.Add("Eight");
      Console.WriteLine("ArrayList elements...");
      foreach(string str in list){
         Console.WriteLine(str);
      }
      Console.WriteLine("ArrayList is read-only? = "+list.IsReadOnly);
      Console.WriteLine("Does the element Six in the ArrayList? = "+list.Contains("Six"));
      list.Insert(4, "Twelve");
      Console.WriteLine("\nArrayList elements...UPDATED");
      foreach(string str in list){
         Console.WriteLine(str);
      }
      ArrayList list2 = new ArrayList();
      list2 = (ArrayList)list.Clone();
      Console.WriteLine("\nCloned ArrayList...");
      foreach(string str in list2){
         Console.WriteLine(str);
      }
   }
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

ArrayList elements...
One
Two
Three
Four
Five
Six
Seven
Eight

ArrayList is read-only? = False
Does the element Six in the ArrayList? = True
ArrayList elements...UPDATED
One
Two
Three
Four
Twelve
Five
Six
Seven
Eight

Cloned ArrayList...
One
Two
Three
Four
Twelve
Five
Six
Seven
Eight

コードのポイント

  • list.Clone():ArrayListクラスのICloneableインターフェースを実装したCloneメソッドを呼び出し、シャローコピーを生成します。
  • (ArrayList)キャスト:Cloneメソッドの戻り値はobject型のため、ArrayList型に明示的にキャストする必要があります。
  • Insert(4, "Twelve"):インデックス4の位置に要素を挿入しています。クローン前に挿入されたため、複製側にも反映されています。

サンプルコード2

続いて、別の例を見てみましょう。こちらではRemoveメソッドで要素を削除した後にクローンを作成しています。

using System;
using System.Collections;
public class Demo {
   public static void Main(String[] args){
      ArrayList list1 = new ArrayList();
      list1.Add("A");
      list1.Add("B");
      list1.Add("C");
      list1.Add("D");
      list1.Add("E");
      list1.Add("F");
      list1.Add("G");
      list1.Add("H");
      list1.Add("I");
      Console.WriteLine("Elements in ArrayList1...");
      foreach (string res in list1){
         Console.WriteLine(res);
      }
      ArrayList list2 = new ArrayList();
      list2.Add("A");
      list2.Add("B");
      list2.Add("C");
      list2.Add("D");
      list2.Add("E");
      list2.Add("F");
      list2.Add("G");
      list2.Add("H");
      list2.Add("I");
      list2.Add("G");
      list2.Add("I");
      Console.WriteLine("Elements in ArrayList2...");
      foreach (string res in list2){
         Console.WriteLine(res);
      }
      Console.WriteLine("Count of elements in ArrayList2 = " + list2.Count);
      list2.Remove("G");
      Console.WriteLine("Elements in ArrayList2... (UPDATED)");
      foreach (string res in list2){
         Console.WriteLine(res);
      }
      Console.WriteLine("Count of elements in ArrayList2 (Updated) = " + list2.Count);
      ArrayList list3 = new ArrayList();
      list3 = (ArrayList)list2.Clone();
      Console.WriteLine("\nCloned ArrayList from ArrayList2...");
      foreach(string str in list3){
         Console.WriteLine(str);
      }
   }
}

出力結果

このコードを実行すると、次の出力が得られます。

Elements in ArrayList1...
A
B
C
D
E
F
G
H
I
Elements in ArrayList2...
A
B
C
D
E
F
G
H
I
G
I
Count of elements in ArrayList2 = 11 Elements in ArrayList2... (UPDATED)
A
B
C
D
E
F
H
I
G
I
Count of elements in ArrayList2 (Updated) = 10
Cloned ArrayList from ArrayList2...
A
B
C
D
E
F
H
I
G
I

シャローコピーとディープコピーの違い

Cloneメソッドによるシャローコピーでは、リストの構造(要素の並び)だけが複製されます。つまり、新しいArrayListオブジェクトが作成され、要素の参照がコピーされます。そのため、クローン側に要素を追加・削除しても元のリストには影響しませんが、要素が参照型の場合、その中身を変更すると両方のリストに反映される点に注意が必要です。

一方、ディープコピーでは要素そのものも完全に複製されるため、相互に一切影響を与えません。参照型の要素を含むArrayListを安全に複製したい場合は、各要素を個別にコピーして新しいリストを構築するなどの対応が必要です。

  1. Outlookカレンダーに祝日を追加・削除する方法【保存・印刷の手順も解説】

    今年の祝日がいつになるのか気になったことはありませんか?そんなときは、Outlookカレンダーをチェックしてみましょう。最新バージョンのOutlookでは、祝日や大切な予定の日付をカレンダーに簡単に追加できます。新旧すべてのバージョンのOutlookには、多くの国や宗教の祝日データが用意されており、自由に追加することが可能です。 本記事では、Microsoft Outlookで祝日カレンダーを追加・削除する方法をチュートリアル形式でわかりやすく解説します。祝日カレンダーには世界中の主要な祝日やイベントが表示されるため、休暇や外出、重要なイベント、パーティーなどの計画を立てるのに大変役立ちます。

  2. Excelでチェックリスト(ToDoリスト)を作成する方法!チェックボックスの活用術

    その日のうちにやりたいタスクを管理するのに、多くの方はTo-Doアプリを利用しているのではないでしょうか。タスクを可視化することで、先延ばしを防ぎ、計画的に作業を進められます。しかし、私のようにExcelが好きな人なら、Microsoft ExcelだけでもチェックリストやToDoリストを簡単に作成できることをご存じでしょうか。 Excelのチェックボックスはフォーム作成時に使う程度と思われがちですが、実は日常的なタスク管理にも大変便利です。この記事では、チェックボックスを活用してExcelでチェックリストを作成する方法を、初心者の方にもわかりやすくステップごとに解説します。 Excelでチェ