2009-10-17 9 views
3

J'ai un problème LINQ qui m'a un peu perplexe. Je peux voir beaucoup de moyens alternatifs pour trouver une solution, mais je voudrais essayer de résoudre le problème parce qu'il m'embête!Créer IGrouper à partir d'une structure de données déjà groupée

public enum AnimalType { 
    Cat, 
    Dog, 
    Rodent 
} 

var orderedAnimalTypes = new [] { AnimalType.Rodent, AnimalType.Cat }; 

J'ai une fonction GetAnimals(AnimalType type) qui retourne tous les animaux d'un type donné. Je veux prendre orderedAnimalTypes et rechercher tous les animaux de ce type pour créer une liste ordonnée de groupes. Je veux finir avec un objet de type IEnumerable<IGrouping<AnimalType, Animal>>. C'est une liste de groupements où le Key est de type AnimalType et l'énumération du groupement est de type Animal.

Alors ce que je veux faire est ce (après la projection de la liste orderedAnimalTypes dans un IEnumerable des groupes.

foreach (var group in groups) { 
    AnimalType animalType = group.Key; 
    IEnumerable<Animal> animals = group.ToArray(); 
} 

Je viens de cant semblent le faire avec tout construit LINQ. Je pense que je peux avoir besoin de faire ma propre mise en œuvre de IGrouping de le faire, mais je ne suis pas sûr.

Alternatives

  • je pouvais très faire facilement ce que je veux avec un dictionnaire, mais alors il ne serait pas commandé. Que pourquoi j'essaye d'obtenir un IEnumerable des groupements.
  • Je pourrais aussi utiliser un type anonyme, mais je veux assigner le résultat à un modèle MVC et qui doit être fortement typé. Le type que je veux est IEnumerable<IGrouping<AnimalType, Animal>> mais je ne vois pas comment obtenir ce type.

Répondre

3
orderedAnimalTypes.SelectMany 
(
    animalType => GetAnimals(animalType), 
    (animalType, animal) => new { animalType, animal } 
) 
. 
GroupBy(item => item.animalType, item => item.animal); 
+0

je vais devoir prendre votre parole en ce moment que cela fonctionne ;-) essayant de se rappeler ce que je tentais de groupe il y a 9 mois maintenant! –