11
votes

Comment une liste des syndicats > en C #

J'ai une liste > , et laquelle contient xxx

J'ai besoin d'union de toute la liste intérieure dans une autre liste

donc la liste résultante contiendra xxx

im utilisant pour la boucle pour le faire

Y a-t-il un moyen de le faire en utilisant linq ou lambda expression .

aidez-moi à faire cela.

merci d'avance.


2 commentaires

Et s'il existe des doublons dans vos listes?


Effectuer une opération syndicale dans la liste jettera les duplicats


6 Réponses :


14
votes
List<List<string>> collections = new List<List<string>>()
        {
          new List<string>(){"A" , "B" }, 
          new List<string>() {"C" , "D" }
        };

var list = collections.SelectMany(x => x).ToList();
SelectMany builds up a expression tree that when evaluated flattens the list of list to a single list of combined members.ToList forces the expression tree to be evaluated and which results in a List.If you want to eliminate duplicates you can add a Distinct call before the call to 'ToList()'

0 commentaires

3
votes

Vous pouvez utiliser le SelectMany extension Méthode.

List<List<String>> masterList = { {"A" , "B" }, {"C" , "D" } };

IEnumerable<string> results = masterList.SelectMany(l => l);


3 commentaires

N'entraîne pas une liste .


Ne peut utiliser que des expressions d'initialisation Array pour affecter des types de réseau. Essayez d'utiliser une nouvelle expression à la place.


Cette réponse ne tient pas compte des doublons. Pas un syndicat de listes.



3
votes
var result = myLists.SelectMany(l => l);

3 commentaires

Cette réponse ne tient pas compte des doublons. Pas un syndicat de listes.


@Brian: L'OP a ajouté les exigences duplicats après la publication de cette réponse.


L'OP a demandé comment syndicaliser toutes les listes. L'opérateur de l'Union, par définition, exclut les doublons. Cela est vrai à la fois en théorie définie et dans la mise en œuvre de l'Union à Linq. Votre solution ne donne pas l'union des ensembles. Il donne les ensembles concaténés ensemble. C'est différent.



14
votes

Pas exactement un syndicat, mais vous pouvez essayer ce xxx


2 commentaires

En fait, l'Union est vraiment juste concat (). Distinct (). Au lieu de Concat, vous utilisez SelectMany car il s'agit d'une liste de listes ... Alors ... En d'autres termes ... C'est la seule réponse correcte que je vois ici. Toutes les autres réponses négligent qu'il peut y avoir des duplicats. L'OP veut un syndicat qui se débarrasse des dupes.


Est-ce que .NET fournit la fonction d'identité quelque part dans la BCL? Haskell et Scala l'ont à la fois (et à Ruby, je l'ajoutais toujours moi-même), et cela facilite la lecture du code, IMHO. En rubis, ce qui précède serait à peu près votre_list.flat_map {| L | l} .uniq , mais avec la définition suivante identité = -> x {x} il pourrait être écrit comme votre_list.flat_map (& identité) . Dans Scala, ce serait votre identité de colonnette de flatmap Yourlist >> = id , qui est beaucoup plus facile à lire que Toiliste Flatmap (E => E) ou votrelist >> = \ x -> x . Y a-t-il yourlist.selectmany (identité) ?



3
votes

Que diriez-vous d'agréger? XXX

Pour moi, c'est plus expressif que d'utiliser SelectMany, car il vous dit exactement ce que vous faites: Agrégez votre liste de listes en appelant Union sur eux tous.


1 commentaires

+1 ... je suis d'accord avec toi ... c'est plus expressif que SelectMany



1
votes

Juste pour des coups de pied: XXX

Ceci est bien sûr la même solution que @Alexander Taran, juste avec la syntaxe de requête au lieu de la syntaxe de Lambda. (Ou au moins cela devrait être - je n'ai pas mon Linqpad Handy.)


0 commentaires