80

例えば

List<string> name_list1 = new List<string>();
List<string> name_list2 = new List<string>();

コードの後半:

name_list1.Add("McDonald");
name_list1.Add("Harveys");
name_list1.Add("Wendys");

name_list2 = name_list1; // I make a copy of namelist1 to namelist2

したがって、この時点から、name_list1に影響を与えることなく、name_list2に要素を追加したり変更を加えたりし続けたいと思います。それ、どうやったら出来るの?

4

14 に答える 14

175
name_list2 = new List<string>(name_list1);

これにより、リストのクローンが作成されます。

編集:このソリューションは、プリミティブ型に対してのみ機能します。オブジェクトについては、以下の他の応答を参照してください。

于 2012-11-19T03:29:10.337 に答える
11

別のオプションは次のとおりです。ディープクローニング

public static T DeepCopy<T>(T item)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            formatter.Serialize(stream, item);
            stream.Seek(0, SeekOrigin.Begin);
            T result = (T)formatter.Deserialize(stream);
            stream.Close();
            return result;
        }

それで、

あなたが使用することができます:

name_list2 = DeepCopy<List<string>>(name_list1);

また:

name_list2 = DeepCopy(name_list1); 

も機能します。

于 2016-02-23T07:51:31.117 に答える
7

プリミティブ型の場合、これを行うことができます:

List<string> CopyList = new List<string>(OriginalList);

非プリミティブ/ユーザー定義型の場合、これを行うことができます:

List<Person> CopyList = new List<Person>();
foreach(var item in OriginalList)
{
    CopyList.Add(new Person { 
            Name = item.Name,
            Address = item.Address
    });
}
于 2018-10-03T11:21:04.333 に答える
5
name_list2 = new List<string>(name_list1); // Clone list into a different object

この時点で、2 つのリストは異なるオブジェクトです。list1 に影響を与えずに list2 に項目を追加できます

于 2012-11-19T03:30:00.880 に答える
4

問題は割り当てです。割り当てが行われるまで、変数とname_list2 = name_list1;が指すヒープ上に2つの異なるListオブジェクトがあります。あなたはいっぱいになります、それは大丈夫です。しかし、割り当てには、「ヒープ上の同じオブジェクトをポイントにする」と書かれています。以前ポイントしていたリストにはアクセスできなくなり、ガベージコレクションが行われます。本当に必要なのは、の内容をにコピーすることです。これは、List.AddRangeを使用して実行できます。これにより、「浅い」コピーが作成されることに注意してください。これは、リストの内容が文字列である引用例では問題ありませんが、リストメンバーがより複雑なオブジェクトである場合は希望どおりにならない可能性があります。それはすべてあなたのニーズに依存します。name_list1name_list2name_list1name_list2name_list1name_list2name_list1name_list2

于 2012-11-19T03:34:34.507 に答える
2

私はこれのためにlinqが好きです...

リスト要素がプリミティブまたは構造体の場合...

L2 = L1.ToList()

リスト要素がクラスの場合...

L2 = L1.Select(x => x.Copy()).ToList();

の単純Copyな浅いコピーの露出MemberWiseClone、または深いコピーの実装である可能性があります。

于 2017-01-27T18:47:04.753 に答える
1

プリミティブ型の場合:
List ClonedList = new list(OriginalList);

非プリミティブ/ユーザー定義型
の場合: ディープ コピーを実行する必要があります: ディープ コピーは、内部参照型の完全なディープ コピーを作成するために使用されます。これには、MemberwiseClone() によって返されるオブジェクトを構成する必要があります。

Step1- クラスで ICloneable から継承します:
public class MyClass:ICloneable

Step2-実装方法

public MyClass Clone()
{
  MyClass MyClassObj =new MyClass();
  MyClassObj.Property1 = this.Property1;
  .
  .
  MyClassObj.Property_N = this.Property_N;
  return MyClass;
}

Step3- リストのクローンを作成します

List<MyClass> MyClassClone = new List<MyClass>(); 
for(i=0; i<Count; i++)
  {
      MyClassClone.Add(OriginalClaaObj[i].Clone());
  }

これにより、オブジェクトの各アイテムのディープ コピーが作成されます。

于 2018-04-25T16:17:28.327 に答える