2009-11-12 7 views
8

Witam Próbuję dołączyć 1 listę do innej. Zrobiłem to za pomocą AddRange() wcześniej, ale to nie wydaje się być tu pracuje ... Oto kod:Nie można dodać jednej listy do drugiej w C# ... próbując użyć AddRange

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); 

zrobiłem debugowanie, aby sprawdzić wyniki, oto co mam: resultCollection ma rachubę 4 resultCollection2 ma liczbę 6, a po dodaniu zakresu, resultCollection nadal ma tylko liczbę 4, gdy powinna mieć liczbę 10.

Czy ktoś może zobaczyć, co robię źle? Każda pomoc jest doceniana.

Dzięki,
Matt

Odpowiedz

31

Po wywołaniu ToList() nie są owijania kolekcję w List<T> tworzysz nową List<T> z tych samych elementów w nim. Skutecznie robisz tutaj, tworząc nową listę, dodając elementy do niej, a następnie wyrzucając listę.

trzeba by zrobić coś takiego:

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

Ewentualnie, jeśli używasz C# 3.0, wystarczy użyć Concat, np

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

Awesome, działało idealnie, dzięki! – Matt

4

Przypuszczam .ToList() tworzy nową kolekcję. Dlatego Twoje produkty są dodawane do nowej kolekcji, która jest natychmiast wyrzucana, a oryginał pozostaje nietknięty.

+0

Gdybym spróbuj to get wrócił do nowej listy to mówi. "nie można niejawnie przekonwertować typu 'void' na 'System.Collection.Generic.List ' ', więc zgaduję, że nic nie zwraca? – Matt

+0

Ten sam błąd, który popełniłem! AddRange zwraca nieważne. –

+1

Skorzystaj z rozwiązania oferowanego przez Grega Beecha. Ponadto, jeśli akceptujesz go, a nie ja, wskazałem tylko na problem, on zrobił to i dostarczył rozwiązanie! :) – Quibblesome

1

resultCollection.ToList() zwróci nową listę.

Spróbuj.

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

'AddRange' zwraca nieważne. –

+0

Dobrze zauważony ... naprawiony. –

1

Spróbuj

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

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

Można użyć dowolnego z poniższych:

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

czyli

// 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); 

czyli

List<E> list = new List<E>(resultCollection.Concat(resultCollection2)); 
Powiązane problemy