2009-12-23 10 views
249

Wie übertrage ich die in einem List enthaltenen Artikel in einen anderen in C#, ohne foreach zu verwenden?Wie kopiere ich Objekte von Liste zu Liste ohne foreach?

+3

:) Wenn Sie einen tiefen Klon brauchen die ursprüngliche Liste finden Sie die Antwort in dieser verwandten Frage: http://stackoverflow.com/questions/222598/how-do-i-clone-a-generic-list-in-c –

Antwort

457

Sie konnten dieses versuchen:

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

oder wenn Sie C# 3 und .NET 3.5, mit Linq verwenden, können Sie dies tun:

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

Wenn die Elemente vom Typ sind MyClass' statt 'Integer', kopiert es auch die Objekte oder referenziert sie? –

+0

Nicht mit nicht-primitiven Typen arbeiten. Liste copy = neue Liste (lstStudentClass); – garish

+1

Es funktioniert mit allen Typen, solange 'lstStudentClass' eine' IEnumerable 'ist, wird es funktionieren. Wenn Sie anders erfahren, müssen Sie weitere Informationen bereitstellen. –

149

Um den Inhalt eines hinzufügen Liste auf eine andere Liste, die bereits vorhanden ist, können Sie:

targetList.AddRange(sourceList); 

Wenn Sie gerade wollen, um eine neue Kopie der Liste erstellen, sehen Lasse Antwort.

+1

.AddRange mehr performant als neue Liste = IEnum.ToList()? – mrmillsy

+5

@mrmillsy: Nun, sie machen verschiedene Dinge. Meine Antwort konzentriert sich auf "Ich habe bereits eine Liste, und ich möchte die Dinge darauf kopieren" –

+0

True. Meine Frage wäre wahrscheinlich besser für eine neue Frage geeignet. Danke für die Antwort. – mrmillsy

-7

Hier eine andere Methode, aber es ist etwas schlechter im Vergleich zu anderen.

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

Warum würden Sie das tun? Warum nicht 'ToList()' direkt? – nawfal

26

Eine Liste der Elemente

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

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

alle Elemente kopiert werden soll Wenn Sie die ersten drei Elemente kopieren möchten

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

Diese Methode erstellt eine Kopie Ihres l ist aber Ihr Typ sollte serialisierbar sein.

Verwendung:

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

Führt die Serialisierung zu erheblichen Leistungseinbußen? –

3

Und das ist, wenn eine einzelne Eigenschaft in einer anderen Liste Kopieren benötigt wird:

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

OK das ist funktioniert gut Aus den oben genannten Vorschlägen GetRange() für mich nicht als Argument mit einer Liste arbeiten ... so Dinge ein wenig von den Pfosten Süßen oben: (Dank jeden

/* 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); 
} 
+0

Dies ist nicht einmal eine Antwort. –

+0

mmm ... ok gut einige der obigen Vorschläge funktionieren einfach nicht in Vis 17 Ich habe die beste Antwort zur Verfügung gestellt ... und hey presto ... es funktioniert :) –

Verwandte Themen