Est-il possible de convertir deux ou plusieurs listes en une seule liste, dans .NET en utilisant C #?
Par exemple,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
AddRange
déroute ... cherchez-vous la -Méthode?Réponses:
Vous pouvez utiliser le LINQ
Concat
et lesToList
méthodes:Notez qu'il existe des moyens plus efficaces de le faire - ce qui précède fera essentiellement une boucle à travers toutes les entrées, créant un tampon de taille dynamique. Comme vous pouvez prédire la taille pour commencer, vous n'avez pas besoin de ce dimensionnement dynamique ... vous pouvez donc utiliser:
(
AddRange
est dans un boîtier spécial pour plusICollection<T>
d'efficacité.)Je n'adopterais pas cette approche à moins que vous ne deviez vraiment le faire.
la source
productCollection1.ForEach(p => allProducts.Add(p))
est plus performant que AddRange.AddRange
on peut faire une copie de bloc d'un tableau sous-jacent à un autre. Avez-vous des liens pour en témoigner?productionCollection1.ForEach(...)
est plus performant que AddRange". Les performances sont très rarement décrites aussi facilement. Je suis surpris cependant que AddRange ne le bat pas facilement - je dois approfondir cela.AddRange
est la meilleure option pour la vitesse brute (environ 4x et plus les listes sont grandes, meilleure est l'augmentation), comme Jon suggeste.En supposant que vous souhaitiez une liste contenant tous les produits pour les identifiants de catégorie spécifiés, vous pouvez traiter votre requête comme une projection suivie d'une opération d' aplatissement . Il y a un opérateur LINQ qui fait que:
SelectMany
.En C # 4, vous pouvez raccourcir SelectMany pour:
.SelectMany(GetAllProducts)
Si vous avez déjà des listes représentant les produits pour chaque ID, alors ce dont vous avez besoin est une concaténation , comme d'autres le soulignent.
la source
vous pouvez les combiner en utilisant LINQ:
l'approche plus traditionnelle de l'utilisation
List.AddRange()
pourrait cependant être plus efficace.la source
Jetez un œil à List.AddRange pour fusionner les listes
la source
Vous pouvez utiliser la méthode d'extension Concat :
la source
la source
Je sais que c'est une vieille question que je pensais pouvoir ajouter mes 2 cents.
Si vous en avez un,
List<Something>[]
vous pouvez les rejoindre en utilisantAggregate
J'espère que cela t'aides.
la source
Je l'ai déjà commenté mais je pense toujours que c'est une option valide, testez simplement si dans votre environnement est meilleure une solution ou l'autre. Dans mon cas particulier, l'utilisation
source.ForEach(p => dest.Add(p))
est plus performante que le classique,AddRange
mais je n'ai pas cherché à savoir pourquoi au niveau bas.Vous pouvez voir un exemple de code ici: https://gist.github.com/mcliment/4690433
L'option serait donc:
Testez-le pour voir si cela fonctionne pour vous.
Avertissement : je ne préconise pas cette solution, je trouve
Concat
la plus claire. Je viens de dire - dans ma discussion avec Jon - que dans ma machine, ce cas fonctionne mieux queAddRange
, mais il dit, avec beaucoup plus de connaissances que moi, que cela n'a pas de sens. Il y a l'essentiel si vous voulez comparer.la source
var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();
qui l'ajoute à la GridView mais en une seule colonne. Je voudrais les diviser en trois colonnes distinctes.De cette façon, il s'agit d'une liste multidimensionnelle et le .SelectMany () l'aplatira en un produit IEnumerable, puis j'utiliserai la méthode .ToList () après.
la source
Pour fusionner ou combiner en listes dans une seule liste.
Il y a une chose qui doit être vraie: le type des deux listes sera égal.
Par exemple : si nous avons une liste de
string
sorte que nous pouvons ajouter ajouter une autre liste à la liste existante qui a une liste de type chaîne sinon nous ne pouvons pas.Exemple :
la source
Dans le cas particulier: "Tous les éléments de List1 vont dans un nouveau List2": (par exemple une liste de chaînes)
Dans ce cas, list2 est généré avec tous les éléments de list1.
la source
Vous devez utiliser l'opération Concat
la source
Lorsque vous avez quelques listes mais que vous ne savez pas exactement combien, utilisez ceci:
listsOfProducts
contient quelques listes remplies d'objets.la source