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.