2012-03-01 8 views
14

Ecco alcuni esempi di codice:C'è un modo semplice per aggiungere un IList <MyType> a un altro?

IList<MyType> myList1=new List<MyType>(); 
IList<MyType> myList2=new List<MyType>(); 

// Populate myList1 
... 
// Add contents of myList1 to myList2 
myList2.Add(myList1); // Does not compile 

Come faccio ad aggiungere il contenuto di una lista ad un altro - c'è un metodo per questo?

+0

'targetList.AddRange (sourceList);' – vulkanino

+1

@vulkanino 'AddRange' è un metodo di' Elenco <> ', non' IList <> '. – phoog

+0

sì, mi dispiace, volevo dire un cast che non ho specificato. – vulkanino

risposta

24

Non esiste un modo integrato per farlo. In realtà quello che vuoi è un metodo AddRange ma non esiste su IList<T> (o sulla sua gerarchia). Definizione di un nuovo metodo di estensione anche se per questo è semplice

public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) { 
    foreach (var cur in enumerable) { 
    collection.Add(cur); 
    } 
} 

myList2.AddRange(myList1); 
+0

@downvoter cura di spiegare? – JaredPar

+0

Sono un revisore, non un downvoter, ma potrebbe essere dovuto al fatto che "è eccessivo dichiarare un metodo per un compito così semplice". Ho ricevuto una critica simile per una mia risposta; il metodo era forse 5 o 6 righe di codice, che salvavano solo un paio di righe di codice nel sito di chiamata. Ma il sito di chiamata è stato modificato in una singola espressione piuttosto che in 2 o 3 istruzioni e, naturalmente, se il metodo viene utilizzato più di una manciata di volte, si verifica una diminuzione netta delle righe di codice. – phoog

+0

@phoog si, se lo stavo usando solo una volta avrei solo inserito il 'foreach'. Questo però è uno dei metodi di estensione standard (come 'ForEach') che ho appena definito in ogni progetto che scrivo. Sono così incredibilmente utili. – JaredPar

0

Se il tipo di runtime del secondo elenco è List<T>, è possibile eseguire il cast su quel tipo e utilizzare il metodo AddRange().

Altrimenti, devi farlo da solo con un ciclo. In alternativa, è possibile utilizzare linq per creare un nuovo elenco contenente i contenuti di entrambi gli elenchi di origine.

10

Se si dichiara entrambi i tipi di elenco come il calcestruzzo List invece di IList, è possibile utilizzare il metodo AddRange:

List<MyType> myList1=new List<MyType>(); 
List<MyType> myList2=new List<MyType>(); 

myList2.AddRange(myList1); 

altrimenti si potrebbe usare LINQ to combinare i due:

using System.Linq; 

IList<MyType> myList1=new List<MyType>(); 
IList<MyType> myList2=new List<MyType>(); 

var newList = myList1.Concat(myList2); 
+1

Sebbene la soluzione LINQ sia bella al punto di vista, ha l'inefficienza di fare una nuova lista con gli articoli combinati. –

+0

Michael, in ogni caso ha pro e contras (: –

11
estensione

Usa Enumerablr,

myList2=new List<MyType>(myList2.Concat(myList1)) 

BTW, se non si popola myList2, è sufficiente crearlo in base a myLis1.

EDIT

ho cercare di perfomance di ricerca per diversi casi

1) AddRange tramite add

List2.AddRange(List1); 

public static class AddRangeUtils 
{ 
    public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) 
    { 
     foreach (var cur in enumerable) 
     { 
      collection.Add(cur); 
     } 
    } 
} 

2) Concat

List2 = new List<TestClass>(List2.Concat(List1)) 

3) predefiniti Collezione Conte 1

var thirdList = new List<TestClass>(List2.Count + List1.Count); 
foreach (var testClass in List1) 
{ 
    thirdList.Add(testClass); 
} 
foreach (var testClass in List2) 
{ 
    thirdList.Add(testClass); 
} 
List2 = thirdList; 

4) predefiniti Collezione Count 2

var thirdList = new List<TestClass>(List2.Count + List1.Count); 
thirdList.AddRange(List1); 
thirdList.AddRange(List2); 
List2 = thirdList; 

della Collection è il conteggio di elementi per ciascuna lista, List1 e List2: ed è venuto a tali risultati (con lunghezza diversa della raccolta)

results for calculation

+1

Questo non aggiunge il valore a 'myList2', ma crea un nuovo valore' Lista . Questo è diverso da quello che l'OP sta chiedendo – JaredPar

+0

di cource , è necessario assegnarlo a myList. Ok, ho modificato –

+2

Questo ha una complessità orribile nel tempo in caso di aggiunta di più elenchi. –

Problemi correlati