使用LINQ选择并按字符串出现分组?

时间:2017-10-24 21:34:21

标签: c# linq

我有一些我想要计算和分组的数据。它看起来像这样:

猫猫狗狗狗

我的目标是获取具有动物名称的对象列表及其在数据集中出现的次数

对象1

姓名:猫

NumberAppearances:2

对象2

姓名:狗

NumberAppearances:3

我正在尝试使用LINQ查询执行此操作,这就是我所拥有的,但计数错误。我认为这是计算长度而不是它出现的次数。我该如何修改?

animalData.Select(x => x.AnimalType).Distinct().ToList().ForEach(a => 

    AnimalObject animal = new AnimalObject();

    animal.Name = a.Name;

    animal.Number = a.Distinct().Count();

    animalList.Add(animal);

});

3 个答案:

答案 0 :(得分:4)

这就是完成任务所需的全部内容:

var result = animalData.GroupBy(x => x.AnimalType).Select(g => new AnimalObject 
             {
                 Name = g.Key,
                 Number = g.Count()
             }).ToList();

foreach (var e in result)
    Console.WriteLine($"Name: {e.Name} \n NumberAppearances: {e.Number}");

注意 -

  1. 由于您当前正在编写LINQ查询,因此无需调用 distinct ToList ,因为前者将导致 在不正确的结果和后者是不必要的。
  2. 坚持良好的命名约定,在类型名称后面不需要 Object 后缀,所以只需 Animal 即可。

答案 1 :(得分:0)

在Dictionary:

的帮助下,您可以在不创建新对象的情况下使用此对象
var animalCounts = animalList.GroupBy(a => a.AnimalType).ToDictionary(
                                 grp => grp.Key, grp => grp.ToList().Count());
foreach(var animalCount in animalCounts) {
   Console.WriteLine($"Name: {animalCount.Key}{Environment.NewLine}NumberOfApperances: {animalCount.Value}");
}

答案 2 :(得分:0)

按AnimalType对数据进行分组,然后将其转换为AnimalObject。

var result = animalData.GroupBy(x => x.AnimalType)
                            .Select(g => new AnimalObject { Name = g.Key, Number = g.Count() })
                            .ToList();