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.