Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion zum Deep-Copy-Problem von List-Objekten in C#

Eine kurze Diskussion zum Deep-Copy-Problem von List-Objekten in C#

高洛峰
高洛峰Original
2017-01-19 13:09:481441Durchsuche

1. Wenn T im List8742468051c85b06f0a0af9e3e506b5c-Objekt ein Werttyp ist (int-Typ usw.)

Für eine Liste von Werttypen können Sie es direkt mit der folgenden Methode kopieren:

List<T> oldList = new List<T>();
oldList.Add(..);
List<T> newList = new List<T>(oldList);

2. Wenn T im List8742468051c85b06f0a0af9e3e506b5c-Objekt ein Referenztyp ist (z. B. eine benutzerdefinierte Entitätsklasse)

1 Mit der oben genannten Methode werden nur die Verweise auf die Objekte in der Liste kopiert. Sie können zum Kopieren die folgenden Erweiterungsmethoden verwenden:

static class Extensions
 {
     public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
     {
         return listToClone.Select(item => (T)item.Clone()).ToList();
     }
 //当然前题是List中的对象要实现ICloneable接口
 }

2. Eine andere Möglichkeit zum Vervollständigen Eine tiefe Kopie des Referenzobjekts erfolgt durch Serialisierung.

public static T Clone<T>(T RealObject)
 
{
   using (Stream objectStream = new MemoryStream())
   {
      //利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
       IFormatter formatter = new BinaryFormatter();
       formatter.Serialize(objectStream, RealObject);
       objectStream.Seek(0, SeekOrigin.Begin);
       return (T)formatter.Deserialize(objectStream);
   }
}

3. Testen Sie die tiefe Kopie der oben genannten Objekte

public static T Clone<T>(T RealObject)
{
      using(Stream stream=new MemoryStream())
      {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(stream, RealObject);
        stream.Seek(0, SeekOrigin.Begin);
        return (T)serializer.Deserialize(stream);
      }
}
Der Test ist wie folgt:

Der obige Artikel geht kurz auf das Deep-Copy-Problem von Listenobjekten in C# ein. Ich hoffe, dass es so ist Ich kann Ihnen auch eine Referenz geben. Ich hoffe auch, dass jeder die chinesische PHP-Website unterstützt.

using System;
using System.Collections.Generic;
using System.Collections ;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace LINQ
{
  [Serializable]
  public class tt
  {
    private string name = "";
 
    public string Name
    {
      get { return name; }
      set { name = value; }
    }
    private string sex = "";
 
    public string Sex
    {
      get { return sex; }
      set { sex = value; }
    }
  }
 
  class LINQTest
  {
    public static T Clone<T>(T RealObject)
    {
      using (Stream objectStream = new MemoryStream())
      {
        IFormatter formatter = new BinaryFormatter();
        formatter.Serialize(objectStream, RealObject);
        objectStream.Seek(0, SeekOrigin.Begin);
        return (T)formatter.Deserialize(objectStream);
      }
    }
 
 
    public static void Main()
    {
      List<tt> lsttt = new List<tt>();
      tt tt1 = new tt();
      tt1.Name = "a1";
      tt1.Sex = "20";
      lsttt.Add(tt1);
      List<tt> l333 = new List<tt>();
      l333.Add(Clone<tt>(lsttt[0]));
      l333[0].Name = "333333333";
   }
 }
}
Weitere Artikel zum Deep-Copy-Problem von List8742468051c85b06f0a0af9e3e506b5c-Objekten in C# finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn