2012-03-08 17 views
13

संभव डुप्लिकेट:
How do I clone a generic list in C#?सूची <MyObject> की सही क्लोन कैसे बनाएं?

List<MyObject> a1 = new List<MyObject>(); 

var new1 = a1; 

अब अगर मैं बदल a1 तो new1 रूप में अच्छी तरह से बदला जा रहा है।

तो मेरा सवाल यह है कि ए 1 का क्लोन बनाने के लिए कैसे सही है?

+2

देखें: http://stackoverflow.com/questions/222598/how-do-i-clone-a-generic-list-in-c –

उत्तर

28

यह अभ्यस्त Clone प्रत्येक सूची में आइटम लेकिन आप MyObject

var new1 = new List<MyObject>(a1.Select(x => x.Clone())); 

पर सूची में प्रत्येक आइटम आप ICloneable लागू कर सकते हैं क्लोन करने के लिए चाहते हैं तो आप एक नई सूची

var new1 = new List<MyObject>(a1); 

पैदा करेगा संपादित करें: इसे थोड़ा स्पष्ट बनाने के लिए दोनों तत्वों को एक नई सूची में a1 से कॉपी करेंगे। आपको बस यह तय करने की आवश्यकता है कि क्या आप नया MyObject एस रखना चाहते हैं या मूल रखना चाहते हैं। यदि आप MyObject क्लोन करना चाहते हैं तो आपको उनको क्लोन करने का एक तरीका होगा जो आम तौर पर ICloneable के माध्यम से किया जाता है।

+6

उसका समाधान सभी वस्तुओं का इलाज क्यों नहीं कर रहा है? –

+1

var new1 = नई सूची (ए 1); केवल मूल्य प्रकारों के लिए काम करता है, आपको अपना उत्तर अपडेट करना चाहिए। –

5

या, आप कुछ इस तरह कर सकता है:

var new1 = CloneClass.CloneObject<List<<MyObject>>(a1); 
+0

आपके पास एक बहुत अधिक "<" है। <सूची होना चाहिए> – user890332

1

मुझे लगता है कि सामान्य व्यवहार करता है, तो यह एक उथला है, क्योंकि यह स्पष्ट नहीं है Clone का उपयोग कर से बचने के लिए है:

public static class CloneClass 
{ 
    /// <summary> 
    /// Clones a object via shallow copy 
    /// </summary> 
    /// <typeparam name="T">Object Type to Clone</typeparam> 
    /// <param name="obj">Object to Clone</param> 
    /// <returns>New Object reference</returns> 
    public static T CloneObject<T>(this T obj) where T : class 
    { 
     if (obj == null) return null; 
     System.Reflection.MethodInfo inst = obj.GetType().GetMethod("MemberwiseClone", 
      System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
     if (inst != null) 
      return (T)inst.Invoke(obj, null); 
     else 
      return null; 
    } 
} 

फिर इसे पसंद का उपयोग वस्तु की गहरी प्रति बनाम बनाम।

कि यहां पर अधिक: http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx

एक बहुत ही आम समाधान एक वस्तु derialize को क्रमानुसार/करने के लिए BinaryFormatter वर्ग का उपयोग करें और नया उदाहरण लौटने के लिए, लेकिन चेतावनी के साथ वर्ग serializable होना चाहिए कि करने के लिए किया गया है:

https://stackoverflow.com/a/1213649/1212407

ऊपर मान लिया जाये कि, तुम कर सकते हो:

var clonedList = originaList.DeepClone();