2010-07-16 4 views
2

est-il possible de définir une instruction LINQ pour les problèmes suivants SANS utiliser une boucle foreach?LINQ: Comment joindre des listes imbriquées dans une ObjectCollection

public class GroupObject 
{ 
    public String name; 
    public List<String> letters; 

    public void test() 
    { 
     List<GroupObject> myGroups = new List<GroupObject> { 
      new GroupObject { 
       name="test1", 
       letters=new List<String>{"x","y","z"} 
      }, 
      new GroupObject { 
       name="test2", 
       letters=new List<String>{"l","m","n"} 
      }, 
      new GroupObject { 
       name="test3", 
       letters=new List<String>{"m","x","z"} 
      } 
     }; 

     // LINQ problem 1: how to get a list of all 9 letters 
     // List<string> allLetters = (from ...).ToList(); 

     // LINQ problem 2: how to get a list of all 6 DISTINCT letters 
     // List<string> allDistictLetters = (from ...).ToList(); 
    } 
} 

En écrivant cette question, j'ai trouvé une solution aux problèmes. Je vais encore poster (et répondre) à la question, car celui-ci était un vrai bugger pour moi. Et je n'ai pas trouvé de question existante appropriée ici.

Ciao, Juve

Répondre

4

Je crois que ce problème peut être résolu par SelectMany et Distinct!

var allLetters = myGroups.SelectMany(go => go.letters); 
var allUniqueLetters = allLetters.Distinct(); 

Le deuxième nom de variable est trompeur. Il reviendra, entre autres lettres, une instance de "m", qui était pas unique dans la collection originale;)

+0

Wow, vous étiez vraiment rapide! Je vais essayer ça. – Juve

+0

Fonctionne parfaitement! Et c'est beaucoup plus court que ma solution. Même si cela peut être plus énigmatique pour les gens qui ne comprennent pas lambda. Merci beaucoup! – Juve

+0

@Juve: de rien. Je trouve que les sélecteurs «de ...» deviennent rapidement «extrêmement» cryptiques quand ils deviennent un peu plus compliqués que ça. et si cela incite le lecteur à aller de l'avant et à apprendre comment fonctionne lambda en C#, vous les aurez énormément aidés;) –

0

Comme indiqué plus haut, j'ai trouvé la réponse moi-même:

List<string> allLetters = (from g in myGroups from l in g.letters select l).ToList(); 
List<string> allDistinctLetters = allLetters.Distinct().ToList(); 

J'espère que cela utile pour quelqu'un.

Ciao, Juve

Questions connexes