我有一个List<KeyValuePair<string, string[]>>,我用下面的数据填充了这个列表,我使用下面的代码来填充datatable代码中的列表:
dicArray = dtrd.AsEnumerable()
.Select(Row => Row["IDp"]).Distinct()
.Select(Id => new KeyValuePair<string, string[]>(
Id.ToString(),
dtrd.AsEnumerable()
.Where(Row => Row["IDp"].ToString() == Id.ToString())
.Select(Row => Row["date"].ToString())
.ToArray()))
.ToList();数据
1:
2017-2-1
2017-2-1
2017-2-1
2017-2-2
2017-2-2
2017-2-2
2:
2017-4-1
2017-4-1
3:
2017-3-1
2017-3-1现在我想按日期分组这个列表来生成这个输出。
1:
2017-2-1 count:3
2017-2-2 count:3
2:
2017-4-1 count:2
3:
2017-3-1 count:2发布于 2017-04-27 08:19:19
你想按ID和日期分组吗?首先需要SelectMany来将数组扁平化:
var query = list
.SelectMany(kv => kv.Value.Select(s => new { Id = kv.Key, Date = s }))
.GroupBy(x => new { x.Id, x.Date })
.Select(g => new { g.Key.Id, g.Key.Date, Count = g.Count() });SelectMany为所有数组中的每个字符串创建一个具有两个属性的匿名类型。GroupBy为每个Id+Date组合创建一个组。Select添加了Count属性。根据你最后的评论:
var query = listKeyValue
.SelectMany(kv => kv.Value
.Select(arr => new
{
Id = kv.Key,
Fields = arr.Split(';')
}))
.Select(x => new
{
x.Id,
Date = x.Fields[0],
Number = x.Fields.Last()
})
.GroupBy(x => new { x.Date, x.Number })
.Select(g => new { g.Key.Date, g.Key.Number, Count = g.Count() });https://stackoverflow.com/questions/43652235
复制相似问题