在记录列表上使用LINQ分组

时间:2013-07-24 13:50:56

标签: c# linq

我在C#中定义了以下DTO对象:

public class Record
{
    public List<EventType> EventTypes { get; set; }
}

并且在列出&lt;记录和GT;填充而EventType定义为枚举

public Enum EventType {
  UNLOCK = 1,
  LOCK = 2
}

现在我想制作一份类似于记录列表的报告:

count       Name
=====       ======
3           UNLOCK
1           LOCK

...通过使用(很可能是LINQ group by)。制作此列表的首选方法是什么?我假设我必须制作另一个能够保存这些数据的DTO。

1 个答案:

答案 0 :(得分:3)

根据您想要的结果数据类型,您可以使用以下任何一种:

var result = records.SelectMany(x => x.EventTypes)
                    .GroupBy(x => x)
                    .ToDictionary(x => x.Key, x => x.Count());

var result = records.SelectMany(x => x.EventTypes)
                    .GroupBy(x => x)
                    .Select(x => new { Name = x.Key, Count = x.Count());

var result = records.SelectMany(x => x.EventTypes)
                    .GroupBy(x => x)
                    .Select(x => new YourType(x.Key, x.Count()));

第一个将导致一个字典,其中事件类型是键,它在列表中出现的次数为值。

第二个将导致包含两个属性NameCount的匿名类型的可枚举。

第三个将导致类型YourType的可枚举,它将事件类型及其出现次数传递给其构造函数。