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

319

Bagaimana cara mentransfer item yang terkandung dalam satu Listke yang lain dalam C # tanpa menggunakan foreach?

rapi
sumber
3
Jika Anda membutuhkan clone mendalam dari daftar asli Anda akan menemukan jawaban dalam pertanyaan terkait ini: stackoverflow.com/questions/222598/...
Dirk Vollmar

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();
Lasse V. Karlsen
sumber
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.

Jon Skeet
sumber
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);
Paras
sumber
5

Dan ini diperlukan jika menyalin satu properti ke daftar lain:

targetList.AddRange(sourceList.Select(i => i.NeededProperty));
BermanfaatBee
sumber
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;
    }
menyolok
sumber
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 );
}
Jim Stevens
sumber
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();
Rajeev
sumber
-9

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

List<int> i=original.Take(original.count).ToList();
rapi
sumber
24
Kenapa kamu ingin melakukan itu? Kenapa tidak ToList()langsung?
nawfal