मैं सूची से आइटम की प्रतिलिपि कैसे बना सकता हूँ?


318

मैं Listबिना उपयोग किए C # में एक से दूसरे में निहित वस्तुओं को कैसे स्थानांतरित करूं foreach?


3
यदि आपको मूल सूची के गहरे क्लोन की आवश्यकता है, तो आपको इस संबंधित प्रश्न का उत्तर मिलेगा: stackoverflow.com/questions/222598/…
डर्क वोल्मार

जवाबों:


554

आप यह कोशिश कर सकते हैं:

List<Int32> copy = new List<Int32>(original);

या यदि आप Linq के साथ C # 3 और .NET 3.5 का उपयोग कर रहे हैं, तो आप यह कर सकते हैं:

List<Int32> copy = original.ToList();

14
यदि आइटम MyClassइसके बजाय प्रकार के हैं Integer, तो क्या यह आइटम को भी कॉपी करता है, या केवल उन्हें संदर्भित करता है?
पेड्रो मोरिरा

5
गैर-आदिम प्रकारों के साथ काम नहीं कर रहा है। सूची <StudentClass> copy = नई सूची <StudentClass> (lstStudentClass);
भड़कीले

4
यह सभी प्रकार के साथ काम करता है, जब तक कि lstStudentClassयह एक है IEnumerable<StudentClass>, यह काम करेगा। यदि आप अनुभव करते हैं तो आपको अधिक जानकारी प्रदान करने की आवश्यकता है।
लास वी। कार्लसन 11

1
(मूल) का अर्थ क्या है; अंत में
राहुल चौधरी

1
आप सूची के निर्माता के लिए एक संग्रह पर पास करते हैं, और निर्माणकर्ता उस संग्रह के सभी तत्वों को नई बनाई गई सूची में कॉपी कर देगा।
लास वी। कार्लसन

170

एक सूची की सामग्री को दूसरी सूची में जोड़ने के लिए जो पहले से मौजूद है, आप इसका उपयोग कर सकते हैं:

targetList.AddRange(sourceList);

यदि आप सूची की एक नई प्रति बनाना चाहते हैं, तो लस का उत्तर देखें।


6
@mrills: अच्छी तरह से वे अलग चीजें करते हैं। मेरा जवाब "मेरे पास पहले से ही एक सूची है, और मैं चीजों को कॉपी करना चाहता हूं" पर ध्यान केंद्रित किया गया है
जॉन स्कीट

सच। मेरा प्रश्न शायद वैसे भी एक नए प्रश्न के लिए बेहतर होगा। हालांकि उत्तर के लिए धन्यवाद।
मर्मिलि

1
यदि आप किसी मौजूदा सूची की सामग्री को पूरी तरह से बदलना चाहते हैं, तो आप पहले targetList.Clear () को कॉल करेंगे।
इब्राहिम

33

तत्वों की सूची के लिए

List<string> lstTest = new List<string>();

lstTest.Add("test1");
lstTest.Add("test2");
lstTest.Add("test3");
lstTest.Add("test4");
lstTest.Add("test5");
lstTest.Add("test6");

यदि आप सभी तत्वों को कॉपी करना चाहते हैं

List<string> lstNew = new List<string>();
lstNew.AddRange(lstTest);

यदि आप पहले 3 तत्वों को कॉपी करना चाहते हैं

List<string> lstNew = lstTest.GetRange(0, 3);

5

और यह है अगर किसी एक संपत्ति को दूसरी सूची में कॉपी करना आवश्यक है:

targetList.AddRange(sourceList.Select(i => i.NeededProperty));

4

यह विधि आपकी सूची की एक प्रति तैयार करेगी लेकिन आपका प्रकार क्रमबद्ध होना चाहिए।

उपयोग:

List<Student> lstStudent = db.Students.Where(s => s.DOB < DateTime.Now).ToList().CopyList(); 

तरीका:

public static List<T> CopyList<T>(this List<T> lst)
    {
        List<T> lstCopy = new List<T>();
        foreach (var item in lst)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, item);
                stream.Position = 0;
                lstCopy.Add((T)formatter.Deserialize(stream));
            }
        }
        return lstCopy;
    }

क्या क्रमांकन एक महत्वपूर्ण प्रदर्शन दंड बनाता है?
दान

0

ठीक है, यह अच्छी तरह से काम कर रहा है GetRange () के ऊपर दिए गए सुझावों से मेरे लिए एक तर्क के रूप में एक सूची के साथ काम नहीं करता है ... इसलिए ऊपर की पोस्ट से चीजों को थोड़ा मीठा करना: (सभी को धन्यवाद :)

/*  Where __strBuf is a string list used as a dumping ground for data  */
public List < string > pullStrLst( )
{
    List < string > lst;

    lst = __strBuf.GetRange( 0, __strBuf.Count );     

    __strBuf.Clear( );

    return( lst );
}

2
यह भी कोई जवाब नहीं है।
मैकीज जुरेस्को

mmm ... ठीक है, ऊपर दिए गए सुझावों में से कुछ बस विज़ 17 में काम नहीं करते हैं, मैंने सबसे अच्छा उत्तर दिया है ... और हे प्रीस्टो ... यह काम करता है :)
जिम स्टीवंस

0

लूप के बिना लाइनक द्वारा सूची के विभिन्न सेट को मैप करना आसान है

var List1= new List<Entities1>();

var List2= new List<Entities2>();

var List2 = List1.Select(p => new Entities2
        {
            EntityCode = p.EntityCode,
            EntityId = p.EntityId,
            EntityName = p.EntityName
        }).ToList();

-9

यहाँ एक और तरीका है, लेकिन यह अन्य की तुलना में थोड़ा खराब है।

List<int> i=original.Take(original.count).ToList();

24
तुम ऐसा क्यों करोगे? ToList()सीधे क्यों नहीं ?
नवाफाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.