ฉันจะคัดลอกรายการจากรายการไปยังรายการโดยไม่ foreach ได้อย่างไร


318

ฉันจะถ่ายโอนรายการที่มีในรายการหนึ่งListไปอีกรายการหนึ่งใน C # โดยไม่ต้องใช้ได้foreachอย่างไร


3
หากคุณต้องการโคลนแบบลึกของรายการต้นฉบับคุณจะพบคำตอบในคำถามที่เกี่ยวข้องนี้: stackoverflow.com/questions/222598/…
Dirk Vollmar

คำตอบ:


554

คุณสามารถลองสิ่งนี้:

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

หรือถ้าคุณใช้ C # 3 และ. NET 3.5 กับ Linq คุณสามารถทำได้:

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

14
หากไอเท็มนั้นเป็นชนิดMyClassแทนที่จะเป็นIntegerมันก็อปปี้ไอเท็มด้วยหรือแค่อ้างอิงมัน?
Pedro Moreira

5
ไม่ทำงานกับประเภทที่ไม่ใช่ดั้งเดิม List <StudentClass> copy = new List <StudentClass> (lstStudentClass);
garish

4
จะทำงานร่วมกับทุกประเภทตราบใดที่lstStudentClassเป็นIEnumerable<StudentClass>ก็จะทำงาน หากคุณพบเป็นอย่างอื่นคุณจะต้องให้ข้อมูลเพิ่มเติม
Lasse V. Karlsen

1
ความหมายของ (ต้นฉบับ) คืออะไร; ในตอนท้าย
Rahul Chaudhari

1
คุณส่งต่อคอลเลกชันไปยังตัวสร้างของรายการและตัวสร้างจะคัดลอกองค์ประกอบทั้งหมดของคอลเลกชันนั้นลงในรายการที่สร้างขึ้นใหม่
Lasse V. Karlsen

170

ในการเพิ่มเนื้อหาของรายการหนึ่งไปยังอีกรายการซึ่งมีอยู่แล้วคุณสามารถใช้:

targetList.AddRange(sourceList);

หากคุณเพียงต้องการสร้างสำเนารายการใหม่ให้ดูคำตอบของ Lasse


6
@mrmillsy: พวกเขาทำสิ่งที่แตกต่างกัน คำตอบของฉันมุ่งเน้นที่ "ฉันมีรายการอยู่แล้วและฉันต้องการคัดลอกสิ่งต่าง ๆ ไปยังมัน"
Jon Skeet

จริง คำถามของฉันอาจเหมาะกับคำถามใหม่อยู่ดี ขอบคุณสำหรับการตอบกลับว่า
mrmillsy

1
หากคุณต้องการแทนที่เนื้อหาของรายการที่มีอยู่อย่างสมบูรณ์คุณจะเรียก targetList.Clear () ก่อน
Ibraheem

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;
    }

การทำให้เป็นอันดับสร้างความผิดพลาดด้านประสิทธิภาพอย่างมาก
Dan Def

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
นี่ไม่ใช่แม้แต่คำตอบ
Maciej Jureczko

mmm ... โอเคข้อเสนอแนะด้านบนไม่ทำงานใน Vis 17 ฉันได้ล้างคำตอบที่ดีที่สุดที่มีให้ ... และเฮ้ presto ... มันใช้งานได้ :)
Jim Stevens

0

ง่ายต่อการแมปชุดรายการที่แตกต่างโดย linq โดยไม่ต้องห่วง

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()โดยตรง
nawfal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.