将列表转换为字典(其中键为过滤后的列表,值为原始列表)

3
class Animal
    {
        public FoodTypes Food { get;set;} 
        public string Name { get; set; }
    }
    enum FoodTypes
    {
        Herbivorous,
        Carnivorous
    }

    class Util
    {
        public static Dictionary<FoodTypes,List<Animal>> GetAnimalListBasedOnFoodType(List<Animal> animals)
        {
            Dictionary<FoodTypes, List<Animal>> map = new Dictionary<FoodTypes, List<Animal>>();
            var foodTypes = animals.Select(o => o.Food).Distinct();
            foreach(var foodType in foodTypes)
            {
                if (!map.ContainsKey(foodType))
                    map.Add(foodType, null);
                map[foodType] = animals.Where(o => o.Food == foodType).ToList();
            }
            return map;
        }
    }

上面的代码是为了让你了解我试图实现什么。现在,问题是是否可能在一个lambda表达式中实现GetAnimalListBasedOnFoodType的功能?

2
通常情况下,你会使用Lookup而不是字典。在你的情况下,应该是animals.ToLookup(a => a.FoodTypes) - undefined
@Martijn所说的,或者GroupBy + ToDictionary - undefined
猪呢?它们是两者兼具的,也就是杂食动物。 - undefined
2个回答

19

这就是您需要的 :)

public static Dictionary<FoodTypes, List<Animal>> GetAnimalListBasedOnFoodType(List<Animal> animals)
{
    return animals
        .GroupBy(animal => animal.Food)
        .ToDictionary(
            group => group.Key,
            group => group.ToList());
}

0

你想要使用GroupBy方法,传入你想要按照哪个属性对动物进行分组。然后,你可以使用ToDictionary方法根据分组创建字典。

例如:

public static Dictionary<FoodTypes, List<Animal>> GetAnimalListBasedOnFoodType(List<Animal> animals)
{
    var animalFoodMap = animals.GroupBy(animal => animal.Food)
                               .ToDictionary(animalGroup => animalGroup.Key, x => animalGroup.ToList());

    return animalFoodMap;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接