Foreach olmadan öğeleri listeden listeye nasıl kopyalarım?


Yanıtlar:


554

Bunu deneyebilirsiniz:

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

veya Linq ile C # 3 ve .NET 3.5 kullanıyorsanız, bunu yapabilirsiniz:

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

14
Öğeler MyClassyerine Integertürlüyse, öğeleri de kopyalar mı, yoksa yalnızca bunlara başvurur mu?
— Pedro Moreira

5
İlkel olmayan tiplerle çalışmaz. Liste <StudentClass> copy = yeni Liste <StudentClass> (lstStudentClass);
— garish

4
Bu sürece, her türlü çalışır lstStudentClassbir olduğunu IEnumerable<StudentClass>, işe yarayacak. Aksi takdirde daha fazla bilgi vermeniz gerekir.
— Lasse V. Karlsen

1
(orijinal) 'in anlamı nedir; sonunda
— Rahul Chaudhari

1
Bir koleksiyonu listenin yapıcısına iletirsiniz ve ardından yapıcı bu koleksiyonun tüm öğelerini yeni oluşturulan listeye kopyalar.
— Lasse V. Karlsen

170

Bir listenin içeriğini zaten var olan başka bir listeye eklemek için aşağıdakileri kullanabilirsiniz:

targetList.AddRange(sourceList);

Listenin yeni bir kopyasını oluşturmak istiyorsanız Lasse'nin cevabına bakın.


6
@mrmillsy: Farklı şeyler yapıyorlar. Cevabım "Zaten bir listem var ve bir şeyler kopyalamak istiyorum" üzerine odaklanmıştır
— Jon Skeet

Doğru. Sorum muhtemelen yeni bir soru için daha uygun olacaktır. Yine de cevap için teşekkürler.
— mrmillsy

1
Mevcut bir listenin içeriğini tamamen değiştirmek isterseniz, önce targetList.Clear () öğesini çağırırsınız.
— Ibraheem

33

Elemanların listesi için

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

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

Tüm öğeleri kopyalamak istiyorsanız

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

İlk 3 öğeyi kopyalamak istiyorsanız

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

5

Tek bir özelliği başka bir listeye kopyalamak gerekirse:

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

4

Bu yöntem listenizin bir kopyasını oluşturur, ancak türünüz serileştirilebilir olmalıdır.

kullanın:

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

Yöntem:

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

Serileştirme önemli bir performans cezası oluşturuyor mu?
— Dan Def

0

Tamam bu iyi çalışıyor Yukarıdaki önerilerden GetRange () bir argüman olarak bir liste ile benim için çalışmıyor ... bu yüzden yukarıdaki mesajlardan biraz tatlı şeyler tatlı: (herkese teşekkürler :)

/*  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
Bu bir cevap bile değil.
— Maciej Jureczko

mmm ... tamam iyi yukarıdaki önerilerin bazıları sadece Vis 17'de çalışmıyor Sağlanan en iyi cevabı temizledim ... ve hey presto ... işe yarıyor :)
— Jim Stevens

0

Döngü olmadan linq ile farklı liste kümesini eşlemek kolaydır

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

Burada başka bir yöntem ama diğerine kıyasla biraz daha kötü.

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

24
Neden bunu yapasın ki? Neden ToList()doğrudan değil ?
— nawfal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.