c# - 使用 linq C# 将列表转换为嵌套字典

标签 c# .net linq .net-4.0 linq-to-objects

我有一个包含这样数据的列表

ID  |   START_DATE          |   END_DATE                |   Chapter     |   ID_OWNER
1       01/03/2013 05:15:14     01/03/2013 06:20:14         1               1
1       01/03/2013 06:25:33     01/03/2013 06:40:11         2               1
1       01/03/2013 05:15:14     01/03/2013 06:20:15         1               2
1       01/03/2013 06:25:33     01/03/2013 06:40:18         2               2   
2       01/03/2013 05:01:34     01/03/2013 05:30:13         1               3
2       01/03/2013 05:31:20     01/03/2013 06:30:13         2               3
2       01/03/2013 06:32:20     01/03/2013 07:20:01         3               3
1       02/03/2013 05:15:14     01/03/2013 06:20:14         1               1
1       02/03/2013 06:25:33     01/03/2013 06:40:11         2               1

我想像这样创建一个字典:

Dictionary<int, Dictionary<string,int>
Dictionary<ID, Dictionary<START_DATE.Date, Total of owners>

结果保持这种方式。

ID
1
    START_DATE      | TOTAL
    01/03/2013          2
    02/03/2013          1
ID
2
    START_DATE      | TOTAL
    01/03/2013          1

有没有办法用 C# 的 linq 来做到这一点?

最佳答案

您可以尝试使用一对 GroupBy 和一对 ToDictionary 调用,如下所示:

var res = list
    .GroupBy(v => v.ID)
    .ToDictionary(
        g => g.Key
    ,   g => g.GroupBy(v => v.START_DATE.Date)
        .ToDictionary(h => h.Key, h => h.Seelct(x => x.ID_OWNER).Distinct().Count())
    );

如果您还想添加每天的总时间,您可以这样做:

var res = list
    .GroupBy(v => v.ID)
    .ToDictionary(
        g => g.Key
    ,   g => g.GroupBy(v => v.START_DATE.Date)
        .ToDictionary(h => h.Key, h => new {
             Count = h.Seelct(x => x.ID_OWNER).Distinct().Count())
         ,   TotalTime = h.Sum(h => x.END_DATE-x.START_DATE)
         }
    );

关于c# - 使用 linq C# 将列表转换为嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17108406/

相关文章:

c# - 重新加载已使用 DllImport 导入的 DLL

c# - 根据条件删除具有多个id的记录

c# - 如何获得最近的日期?

c# - 存储大括号之间元素数量的好方法?

c# - 在 C# 中的 linq-sql 连接查询上有多个 Id

.net - WIX 相对路径最终变得太长

sql - Entity Framework 通过字符串sql过滤数据

javascript - 单击单选按钮时必须输入文本框

c# - 是否可以从 C# 运行 prolog?

.net - Azure 角色内缓存作为 NHibernate 二级缓存?