2009-12-23 17 views
249

Come trasferire gli articoli contenuti in uno List in un altro in C# senza utilizzare foreach?Come posso copiare elementi da un elenco all'altro senza foreach?

+3

Se avete bisogno di una profonda clone di nell'elenco originale troverai la risposta in questa domanda correlata: http://stackoverflow.com/questions/222598/how-do-i-clone-a-generic-list-in-c –

risposta

457

Si potrebbe provare questo:

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

o se si sta utilizzando C# 3 e .NET 3.5, con LINQ, si può fare questo:

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

Se gli elementi sono di tipo ' MyClass' invece di 'Integer', copia anche gli elementi o fa semplicemente riferimento a loro? –

+0

Non funziona con tipi non primitivi. Elenco copy = new List (lstStudentClass); – garish

+1

Funziona con tutti i tipi, a patto che 'lStStudentClass' sia un' IEnumerable ', funzionerà. In caso contrario, è necessario fornire ulteriori informazioni. –

149

Per aggiungere il contenuto di una lista ad un'altra lista che già esiste, è possibile utilizzare:

targetList.AddRange(sourceList); 

Se siete semplicemente desideroso di creare una nuova copia della lista, vedere la risposta di Lasse.

+1

Is.AddRange più performante di New List = IEnum.ToList()? – mrmillsy

+5

@mrmillsy: Beh, fanno cose diverse. La mia risposta è incentrata su "Ho già una lista e voglio copiare le cose" –

+0

Vero. La mia domanda sarebbe probabilmente più adatta ad una nuova domanda comunque. Grazie per la risposta però. – mrmillsy

-7

Qui un altro metodo, ma è un po 'peggio confrontare con altri.

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

Perché dovresti farlo? Perché non 'ToList()' direttamente? – nawfal

26

Per un elenco di elementi

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

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

Se si desidera copiare tutti gli elementi

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

Se si desidera copiare i primi 3 elementi

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

Questo metodo creerà una copia della tua l ist ma il tuo tipo dovrebbe essere serializzabile.

Usa:

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

Metodo:

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

La serializzazione crea una significativa riduzione delle prestazioni? –

3

E questo è se la copia di una singola proprietà di un altro elenco che è necessario:

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

OK questo è funziona bene Dai suggerimenti di cui sopra getRange() non funziona per me con una lista come argomento ... così addolcire le cose un po 'da messaggi di cui sopra: (grazie a tutti :)

/* 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

Questa non è nemmeno una risposta. –

+0

mmm ... ok bene alcuni dei suggerimenti sopra semplicemente non funzionano in Vis 17 Ho ripulito la migliore risposta fornita ... e hey presto ... funziona :) –

Problemi correlati