Czy można przekonwertować dwie lub więcej list na jedną listę w .NET przy użyciu C #?
Na przykład,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
AddRange
metody?Odpowiedzi:
Możesz użyć LINQ
Concat
iToList
metod:Zauważ, że istnieją bardziej wydajne sposoby na zrobienie tego - powyższe będzie zasadniczo przechodzić przez wszystkie wpisy, tworząc bufor o dynamicznym rozmiarze. Jak można przewidzieć wielkość na początek, nie trzeba tego rozmiaru dynamicznego ... więc mógł używać:
(
AddRange
jest specjalnie zaprojektowanyICollection<T>
dla zwiększenia wydajności).Nie przyjąłbym tego podejścia, chyba że naprawdę musisz.
źródło
productCollection1.ForEach(p => allProducts.Add(p))
jest bardziej wydajny niż AddRange.AddRange
można wykonać kopię bloku z jednej podstawowej tablicy do drugiej. Czy masz linki do tego dowodu?productionCollection1.ForEach(...)
kocowych, takich jak „BTW, jest bardziej wydajny niż AddRange”. Wydajność jest bardzo rzadko tak łatwa do opisania. Ja jestem zaskoczony, że AddRange nie bije jej dłoń choć - muszę zbadać to dalej.AddRange
to najlepsza opcja dla prędkości początkowej (około 4x i im większa lista, tym większy wzrost), ponieważ Jon sugerować.Zakładając, że potrzebujesz listy zawierającej wszystkie produkty dla określonych kategorii ID, możesz potraktować swoje zapytanie jako rzut, po którym nastąpi operacja spłaszczenia . Jest operatorem LINQ to robi, że:
SelectMany
.W C # 4 możesz skrócić SelectMany do:
.SelectMany(GetAllProducts)
Jeśli masz już listy reprezentujące produkty dla każdego identyfikatora, to potrzebujesz , jak konkatenacja , jak podkreślają inni.
źródło
możesz je połączyć za pomocą LINQ:
bardziej tradycyjne podejście
List.AddRange()
może być jednak bardziej wydajne.źródło
Spójrz na List.AddRange, aby scalić listy
źródło
Możesz użyć metody rozszerzenia Concat :
źródło
źródło
Wiem, że to stare pytanie, pomyślałem, że mogę dodać 2 centy.
Jeśli masz
List<Something>[]
, możesz do nich dołączyć za pomocąAggregate
Mam nadzieję że to pomoże.
źródło
Już to skomentowałem, ale nadal uważam, że jest to prawidłowa opcja, po prostu sprawdź, czy w twoim środowisku jest lepsze jedno lub drugie rozwiązanie. W moim szczególnym przypadku używanie
source.ForEach(p => dest.Add(p))
działa lepiej niż klasyczny,AddRange
ale nie badałem, dlaczego na niskim poziomie.Przykładowy kod możesz zobaczyć tutaj: https://gist.github.com/mcliment/4690433
Tak więc opcją byłoby:
Przetestuj, aby sprawdzić, czy to działa dla Ciebie.
Oświadczenie : Nie opowiadam się za tym rozwiązaniem, uważam, że jest
Concat
to najbardziej jasne. Właśnie powiedziałem - w mojej dyskusji z Jonem - że w mojej maszynie ta sprawa działa lepiej niżAddRange
, ale on, przy znacznie większej wiedzy niż ja, że to nie ma sensu. Jest sedno, jeśli chcesz porównać.źródło
var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();
co dodaje to do GridView, ale jako jedną kolumnę. Chciałbym podzielić je na trzy osobne kolumny.W ten sposób jest to wielowymiarowa lista, a .SelectMany () spłaszczy ją do IEnumerable produktu, a następnie użyję metody .ToList ().
źródło
Aby scalić lub połączyć z listami w jedną listę.
Jest jedna rzecz, która musi być prawdziwa: typ obu list będzie równy.
Na przykład : jeśli mamy listę,
string
więc możemy dodać kolejną listę do istniejącej listy, która ma listę ciągów znaków, inaczej nie możemy.Przykład :
źródło
W szczególnym przypadku: „Wszystkie elementy List1 trafiają do nowej List2”: (np. Lista ciągów)
W takim przypadku lista 2 jest generowana ze wszystkimi elementami z listy 1.
źródło
Musisz użyć operacji Concat
źródło
Gdy masz kilka list, ale nie wiesz ile dokładnie, użyj tego:
listsOfProducts
zawiera kilka list wypełnionych obiektami.źródło