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

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

高洛峰
Freigeben: 2017-01-19 13:09:48
Original
1467 Leute haben es durchsucht

1. Wenn T im List-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);
Nach dem Login kopieren

2. Wenn T im List-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接口
 }
Nach dem Login kopieren

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);
   }
}
Nach dem Login kopieren

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);
      }
}
Nach dem Login kopieren
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";
   }
 }
}
Nach dem Login kopieren
Weitere Artikel zum Deep-Copy-Problem von List-Objekten in C# finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage