1179 votes

Grouper par dans LINQ

Supposons que si nous avons une classe comme

    class Person { 
        internal int PersonID; 
        internal string car  ; 
    }

Maintenant, j'ai une liste de cette classe: List<Person> persons;

Maintenant, cette liste peut avoir des instances multiples d'un même PersonIDs, pour ex.

    persons[0] = new Person { PersonID = 1, car = "Ferrari" }; 
    persons[1] = new Person { PersonID = 1, car = "BMW"     }; 
    persons[2] = new Person { PersonID = 2, car = "Audi"    }; 

Est il possible que je peux groupe par personID et obtenir la liste de toutes les voitures qu'il a? Pour ex. résultat attendu serait

    class Result { 
       int PersonID;
       List<string> cars; 
    }

Ainsi, après le regroupement, je voudrais obtenir:

    results[0].PersonID = 1; 
    List<string> cars = results[0].cars; 

    result[1].PersonID = 2; 
    List<string> cars = result[1].cars;

De ce que j'ai fait jusqu'à présent:

    var results = from p in persons
                  group p by p.PersonID into g
                  select new { PersonID = g.Key, // this is where I am not sure how to put it

Quelqu'un pourrait-il svp me pointer dans la bonne direction?

1912voto

Jon Skeet Points 692016

Absolument - en gros, vous souhaitez:

var results = from p in persons
              group p.car by p.PersonId into g
              select new { PersonID = g.Key, Cars = g.ToList() };

Ou comme une non-expression de la requête:

var results = persons.GroupBy(p => p.PersonId, p => p.car,
                         (key, g) => new { PersonId = key, Cars = g.ToList() });

Fondamentalement, le contenu du groupe (si la vue en tant qu' IEnumerable<T>) est une séquence de quelles que soient les valeurs étaient dans la projection (p.car dans ce cas) présents pour la clé donnée.

Pour en savoir plus sur la façon dont GroupBy , voir mon Edulinq post sur le sujet.

61voto

Tallat Points 31
var results = from p in persons
              group p by p.PersonID into g
              select new { PersonID = g.Key,
                           /**/car = g.Select(g=>g.car).FirstOrDefault()/**/}

43voto

Yogendra Paudyal Points 156
var results = from p in persons
                          group p by p.PersonID into g
                          select new { PersonID = g.Key, Cars = g.Select(m => m.car) };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X