2009-11-12 4 views
8

Hallo, ich versuche, eine Liste an eine andere anzuhängen. Ich habe es getan mit AddRange() vor, aber es scheint nicht hier arbeiten zu werden ... Hier ist der Code ist:In C# kann keine Liste an eine andere angehängt werden ... versucht, AddRange zu verwenden

IList<E> resultCollection = ((IRepository<E, C>)this).SelectAll(columnName, maxId - startId + 1, startId);     
IList<E> resultCollection2 = ((IRepository<E, C>)this).SelectAll(columnName, endId - minId + 1, minId); 
resultCollection.ToList().AddRange(resultCollection2); 

Ich habe das Debuggen die Ergebnisse zu überprüfen, hier ist, was ich habe: resultCollection eine Zählung hat von 4 resultCollection2 hat eine Anzahl von 6, und nach dem Hinzufügen des Bereichs, resultCollection hat immer noch nur eine Anzahl von 4, wenn es eine Zählung von 10 hätte.

Kann jemand sehen, was ich falsch mache? Jede Hilfe wird geschätzt.

Danke,
Matt

Antwort

31

Wenn Sie anrufen ToList() Sie wickeln nicht die Sammlung in einem List<T> sind Sie ein neues List<T> mit den gleichen Posten in ihm zu schaffen. Was Sie also hier effektiv tun, ist das Erstellen einer neuen Liste, das Hinzufügen der Elemente und das anschließende Löschen der Liste.

Sie müssen so etwas wie zu tun:

List<E> merged = new List<E>(); 
merged.AddRange(resultCollection); 
merged.AddRange(resultCollection2); 

Alternativ, wenn Sie C# 3.0 verwenden, verwenden Sie einfach Concat, z.B.

resultCollection.Concat(resultCollection2); // and optionally .ToList() 
+0

Super, hat perfekt funktioniert, danke! – Matt

4

Ich würde .ToList annehmen() eine neue Kollektion erstellt. Daher werden Ihre Objekte zu einer neuen Sammlung hinzugefügt, die sofort weggeworfen wird und das Original bleibt unberührt.

+0

Wenn ich versuche, so dass es in eine neue Liste zurück zu bekommen es sagt. msgstr "Kann den Typ 'void' nicht implizit in 'System.Collection.Generic.List ' umwandeln", also denke ich, dass nichts zurückgegeben wird? – Matt

+0

Der gleiche Fehler, den ich gemacht habe! AddRange gibt void zurück. –

+1

Verwenden Sie die von Greg Beech angebotene Lösung. Auch, wenn das Akzeptieren für ihn statt für mich geht, habe ich nur auf das Problem hingewiesen, er hat das getan plus eine Lösung zur Verfügung gestellt! :) – Quibblesome

1

resultCollection.ToList() wird eine neue Liste zurückgeben.

Versuchen:.

List<E> list = resultCollection.ToList(); 
list.AddRange(resultCollection2); 
+0

'AddRange' gibt void zurück. –

+0

Gut entdeckt ... behoben. –

1

Versuchen

IList newList = resultCollection.ToList() AddRange (resultCollection2);

List<E> newList = resultCollection.ToList(); 
newList.AddRange(resultCollection2); 
0

können Sie eine der folgenden verwenden:

List<E> list = resultCollection as List<E>; 
if (list == null) 
    list = new List<E>(resultCollection); 
list.AddRange(resultCollection2); 

Oder:

// Edit: this one could be done with LINQ, but there's no reason to limit 
//  yourself to .NET 3.5 when this is just as short. 
List<E> list = new List<E>(resultCollection); 
list.AddRange(resultCollection2); 

Oder:

List<E> list = new List<E>(resultCollection.Concat(resultCollection2)); 
Verwandte Themen