首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过List<KeyValuePair<string、string[]>>在c#.net中进行分组

如何通过List<KeyValuePair<string、string[]>>在c#.net中进行分组
EN

Stack Overflow用户
提问于 2017-04-27 08:15:05
回答 1查看 1.1K关注 0票数 3

我有一个List<KeyValuePair<string, string[]>>,我用下面的数据填充了这个列表,我使用下面的代码来填充datatable代码中的列表:

代码语言:javascript
复制
   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();

数据

代码语言:javascript
复制
 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

现在我想按日期分组这个列表来生成这个输出。

代码语言:javascript
复制
 1: 
    2017-2-1 count:3
    2017-2-2 count:3
   2:
    2017-4-1 count:2 
   3:
    2017-3-1 count:2
EN

回答 1

Stack Overflow用户

发布于 2017-04-27 08:19:19

你想按ID和日期分组吗?首先需要SelectMany来将数组扁平化:

代码语言:javascript
复制
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属性。

根据你最后的评论:

代码语言:javascript
复制
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() });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43652235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档