Wie kopiere ich Elemente von Liste zu Liste ohne foreach?


Antworten:


553

Sie könnten dies versuchen:

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

Wenn Sie C # 3 und .NET 3.5 mit Linq verwenden, können Sie Folgendes tun:

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

14
Wenn die Elemente vom Typ MyClassstatt sind Integer, werden dann auch die Elemente kopiert oder nur referenziert?
Pedro Moreira

5
Funktioniert nicht mit nicht primitiven Typen. List <StudentClass> copy = new List <StudentClass> (lstStudentClass);
grell

4
Es funktioniert mit allen Typen, solange lstStudentClasses ein ist IEnumerable<StudentClass>, wird es funktionieren. Wenn Sie etwas anderes erleben, müssen Sie weitere Informationen bereitstellen.
Lasse V. Karlsen

1
Was bedeutet (Original)? am Ende
Rahul Chaudhari

1
Sie übergeben eine Sammlung an den Konstruktor der Liste, und der Konstruktor kopiert dann alle Elemente dieser Sammlung in die neu erstellte Liste.
Lasse V. Karlsen

170

Um den Inhalt einer Liste zu einer anderen Liste hinzuzufügen, die bereits vorhanden ist, können Sie Folgendes verwenden:

targetList.AddRange(sourceList);

Wenn Sie nur eine neue Kopie der Liste erstellen möchten, lesen Sie die Antwort von Lasse.


6
@ Mrmillsy: Nun, sie machen verschiedene Dinge. Meine Antwort konzentriert sich auf "Ich habe bereits eine Liste und ich möchte Dinge darauf kopieren"
Jon Skeet

Wahr. Meine Frage wäre wahrscheinlich sowieso besser für eine neue Frage geeignet. Vielen Dank für die Antwort.
Mrmillsy

1
Wenn Sie den Inhalt einer vorhandenen Liste vollständig ersetzen möchten, rufen Sie zuerst targetList.Clear () auf.
Ibraheem

33

Für eine Liste von Elementen

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

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

Wenn Sie alle Elemente kopieren möchten

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

Wenn Sie die ersten 3 Elemente kopieren möchten

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

5

Und dies ist der Fall, wenn eine einzelne Eigenschaft in eine andere Liste kopiert werden muss:

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

4

Diese Methode erstellt eine Kopie Ihrer Liste, aber Ihr Typ sollte serialisierbar sein.

Verwenden:

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

Methode:

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

Verursacht die Serialisierung einen erheblichen Leistungsverlust?
Dan Def

0

OK, das funktioniert gut. Aus den obigen Vorschlägen geht hervor, dass GetRange () für mich mit einer Liste als Argument nicht funktioniert ... also versüßen Sie die Dinge ein wenig aus den obigen Beiträgen: (Danke an alle :)

/*  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
Dies ist nicht einmal eine Antwort.
Maciej Jureczko

mmm ... ok, einige der obigen Vorschläge funktionieren in Vis 17 einfach nicht. Ich habe die beste Antwort aufgeräumt ... und hey presto ... es funktioniert :)
Jim Stevens

0

Einfache Zuordnung verschiedener Listensätze durch linq ohne for-Schleife

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

Hier eine andere Methode, aber es ist wenig schlimmer im Vergleich zu anderen.

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

24
Warum würdest du das tun? Warum nicht ToList()direkt?
Nawfal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.