从已经分组的数据结构创建 IGrouping

Sim*_*ver 5 linq igrouping

我有一个 LINQ 问题,这让我有点困惑。我可以看到很多替代方法来找到解决方案,但我想尝试解决问题,因为它困扰着我!

public enum AnimalType {
    Cat,
    Dog,
    Rodent
}

var orderedAnimalTypes = new [] { AnimalType.Rodent, AnimalType.Cat };
Run Code Online (Sandbox Code Playgroud)

我有一个函数GetAnimals(AnimalType type)可以返回给定类型的所有动物。我想获取orderedAnimalTypes并查找该类型的所有动物以创建一个有序的组列表。

我想最终得到一个类型为 的对象IEnumerable<IGrouping<AnimalType, Animal>>。这是一个分组列表,其中Keyis 类型AnimalType和分组的枚举类型为 Animal。

所以我想做的是这个(在将orderedAnimalTypes列表投影到一IEnumerable组之后。

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

我似乎无法使用任何 LINQ 构造来做到这一点。我想我可能需要自己实现 IGrouping 才能做到这一点,但我不确定。

备择方案

  • 我可以很容易地用字典做我想做的事,但它不会被订购。这就是为什么我试图获得一个IEnumerable分组。
  • 我也可以使用匿名类型,但我想将结果分配给 MVC 模型,并且需要强类型。我想要的类型是,IEnumerable<IGrouping<AnimalType, Animal>>但我看不到如何获得该类型。

Pet*_*ský 5

orderedAnimalTypes.SelectMany
(
    animalType => GetAnimals(animalType), 
    (animalType, animal) => new { animalType, animal }
)
.
GroupBy(item => item.animalType, item => item.animal);
Run Code Online (Sandbox Code Playgroud)