如何组合List <keyvaluepair <string,string [] =“”>&gt;在c#.net中

时间:2017-04-27 08:15:05

标签: c# list date group-by

我有一个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

1 个答案:

答案 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() });