Wie kopiere ich Elemente von Liste zu Liste ohne foreach?

318

Wie übertrage ich die darin enthaltenen Elemente Listin C # ohne Verwendung in ein anderes foreach?

schäbig
quelle
3
Wenn Sie einen tiefen Klon der ursprünglichen Liste benötigen, finden Sie die Antwort in dieser verwandten Frage: stackoverflow.com/questions/222598/…
Dirk Vollmar

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

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

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

targetList.AddRange(sourceList.Select(i => i.NeededProperty));
nützlichBee
quelle
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;
    }
grell
quelle
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 );
}
Jim Stevens
quelle
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();
Rajeev
quelle
-9

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

List<int> i=original.Take(original.count).ToList();
schäbig
quelle
24
Warum würdest du das tun? Warum nicht ToList()direkt?
Nawfal