我有一个List<KeyValuePair<string, string[]>>
,我用下面的数据填充此列表,我使用下面的代码填充数据表中的列表
代码:
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
答案 0 :(得分:3)
所以你想按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() });