Ist es möglich, zwei oder mehr Listen in .NET mit C # in eine einzige Liste zu konvertieren?
Beispielsweise,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
AddRange
Methode?Antworten:
Sie können den LINQ
Concat
und dieToList
Methoden verwenden:Beachten Sie, dass es effizientere Möglichkeiten gibt, dies zu tun. Im Folgenden werden grundsätzlich alle Einträge durchlaufen, wodurch ein Puffer mit dynamischer Größe erstellt wird. Wie Sie die Größe , mit zu beginnen vorhersagen können, brauchen Sie nicht diese dynamische Dimensionierung ... so Sie könnten verwenden:
(
AddRange
ist speziellICollection<T>
für Effizienz ausgelegt.)Ich würde diesen Ansatz nicht wählen, wenn Sie es nicht wirklich müssen.
quelle
productCollection1.ForEach(p => allProducts.Add(p))
ist performanter als AddRange.AddRange
darum geht, eine Blockkopie von einem zugrunde liegenden Array in ein anderes zu erstellen . Haben Sie Links, um dies zu beweisen?productionCollection1.ForEach(...)
hasse ich es, pauschale Anweisungen wie "Übrigens, ist leistungsfähiger als AddRange" anzugeben / zu akzeptieren . Leistung ist sehr selten so einfach zu beschreiben. Ich bin überrascht, dass AddRange es nicht leicht schlägt - ich muss das weiter untersuchen.AddRange
ist die beste Option für die Rohgeschwindigkeit ( ungefähr 4x und je größer die Listen, desto besser die Steigerung), wie Jon vorschlagen.Angenommen, Sie möchten eine Liste mit allen Produkten für die angegebenen Kategorie-IDs, können Sie Ihre Abfrage als Projektion behandeln, gefolgt von einem Reduzierungsvorgang . Es gibt einen LINQ-Operator, der das macht :
SelectMany
.In C # 4 können Sie SelectMany verkürzen auf:
.SelectMany(GetAllProducts)
Wenn Sie bereits Listen haben, die die Produkte für jede ID darstellen, benötigen Sie eine Verkettung , wie andere betonen.
quelle
Sie können sie mit LINQ kombinieren:
Der traditionellere Ansatz der Verwendung
List.AddRange()
könnte jedoch effizienter sein.quelle
Schauen Sie sich List.AddRange an, um Listen zusammenzuführen
quelle
Sie können die Concat- Erweiterungsmethode verwenden:
quelle
quelle
Ich weiß, dass dies eine alte Frage ist, von der ich dachte, ich könnte nur meine 2 Cent hinzufügen.
Wenn Sie eine haben
List<Something>[]
, können Sie sie mit verbindenAggregate
Hoffe das hilft.
quelle
Ich habe es bereits kommentiert, aber ich denke immer noch, dass es eine gültige Option ist. Testen Sie einfach, ob in Ihrer Umgebung die eine oder andere Lösung besser ist. In meinem speziellen Fall ist die Verwendung
source.ForEach(p => dest.Add(p))
besser als der Klassiker,AddRange
aber ich habe nicht untersucht, warum dies auf niedrigem Niveau der Fall ist .Einen Beispielcode finden Sie hier: https://gist.github.com/mcliment/4690433
Die Option wäre also:
Testen Sie es, um zu sehen, ob es für Sie funktioniert.
Haftungsausschluss : Ich befürworte diese Lösung nicht, ich finde
Concat
die klarste. Ich habe gerade in meiner Diskussion mit Jon festgestellt, dass dieser Fall in meiner Maschine eine bessere Leistung erbringt alsAddRange
, aber er sagt mit weitaus mehr Wissen als ich, dass dies keinen Sinn ergibt. Es gibt das Wesentliche, wenn Sie vergleichen möchten.quelle
var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();
fügt es der GridView hinzu, aber als eine Spalte. Ich möchte sie in drei separate Spalten aufteilen.Auf diese Weise handelt es sich um eine mehrdimensionale Liste, und .SelectMany () reduziert sie in eine IEnumerable von Produkten. Anschließend verwende ich die Methode .ToList ().
quelle
Zusammenführen oder Kombinieren zu Listen zu einer Ein-Liste.
Eines muss zutreffen: Der Typ beider Listen ist gleich.
Zum Beispiel : Wenn wir eine Liste von haben
string
, können wir der vorhandenen Liste eine weitere Liste hinzufügen, die eine Liste mit Typzeichenfolgen enthält, andernfalls können wir dies nicht.Beispiel :
quelle
Im Sonderfall: "Alle Elemente von List1 gehen in eine neue List2": (zB eine String-Liste)
In diesem Fall wird list2 mit allen Elementen aus list1 generiert.
quelle
Sie müssen den Concat-Betrieb verwenden
quelle
Wenn Sie nur wenige Listen haben, aber nicht genau wissen, wie viele, verwenden Sie Folgendes:
listsOfProducts
enthält nur wenige mit Objekten gefüllte Listen.quelle