Bagaimana cara menyalin item dari daftar ke daftar tanpa perlu tahu terlebih dahulu?


Jawaban:


555

Anda bisa mencoba ini:

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

atau jika Anda menggunakan C # 3 dan .NET 3.5, dengan Linq, Anda dapat melakukan ini:

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

14
Jika itemnya bertipe MyClassbukan Integer, apakah itu menyalin item juga, atau hanya referensi saja?
— Pedro Moreira

6
Tidak berfungsi dengan tipe Non-primitif. List <StudentClass> copy = Daftar baru <StudentClass> (lstStudentClass);
— hiasi

4
Ia bekerja dengan semua jenis, selama lstStudentClassmerupakan IEnumerable<StudentClass>, ia akan bekerja. Jika Anda mengalami sebaliknya, Anda perlu memberikan informasi lebih lanjut.
— Lasse V. Karlsen

1
apa arti dari (asli); pada akhirnya
— Rahul Chaudhari

1
Anda meneruskan koleksi ke konstruktor daftar, dan konstruktor kemudian akan menyalin semua elemen koleksi itu ke daftar yang baru dibuat.
— Lasse V. Karlsen

170

Untuk menambahkan konten dari satu daftar ke daftar lain yang sudah ada, Anda dapat menggunakan:

targetList.AddRange(sourceList);

Jika Anda hanya ingin membuat salinan daftar baru, lihat jawaban Lasse.


6
@ mrmillsy: Ya mereka melakukan hal yang berbeda. Jawaban saya terfokus pada "Saya sudah memiliki daftar, dan saya ingin menyalin sesuatu ke sana"
— Jon Skeet

Benar. Pertanyaan saya mungkin akan lebih cocok untuk pertanyaan baru. Terima kasih atas jawabannya.
— mrmillsy

1
Jika Anda ingin mengganti konten daftar yang ada sepenuhnya, Anda akan memanggil targetList.Clear () terlebih dahulu.
— Ibraheem

33

Untuk daftar elemen

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

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

Jika Anda ingin menyalin semua elemen

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

Jika Anda ingin menyalin 3 elemen pertama

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

5

Dan ini diperlukan jika menyalin satu properti ke daftar lain:

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

4

Metode ini akan membuat salinan daftar Anda tetapi jenis Anda harus serial.

Menggunakan:

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

Metode:

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

Apakah serialisasi menciptakan penalti kinerja yang signifikan?
— Dan Def

0

OK ini bekerja dengan baik Dari saran di atas GetRange () tidak berfungsi untuk saya dengan daftar sebagai argumen ... jadi pemaniskan sedikit dari posting di atas: (terima kasih semuanya :)

/*  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
Ini bahkan bukan jawaban.
— Maciej Jureczko

mmm ... ok baik beberapa saran di atas tidak bekerja di Vis 17 Saya telah membersihkan jawaban terbaik yang disediakan ... dan hei presto ... itu bekerja :)
— Jim Stevens

0

Mudah untuk memetakan set daftar yang berbeda dengan LINQ tanpa untuk loop

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

Di sini metode lain tetapi sedikit lebih buruk dibandingkan dengan yang lain.

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

24
Kenapa kamu ingin melakukan itu? Kenapa tidak ToList()langsung?
— nawfal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.