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

Ren*_*nto 4 .net c# linq linq-to-objects .net-4.0

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

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
Run Code Online (Sandbox Code Playgroud)

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

Dictionary<int, Dictionary<string,int>
Dictionary<ID, Dictionary<START_DATE.Date, Total of owners>
Run Code Online (Sandbox Code Playgroud)

结果留在哪里.

ID
1
    START_DATE      | TOTAL
    01/03/2013          2
    02/03/2013          1
ID
2
    START_DATE      | TOTAL
    01/03/2013          1
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 6

您可以尝试使用一对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())
    );
Run Code Online (Sandbox Code Playgroud)

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

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)
         }
    );
Run Code Online (Sandbox Code Playgroud)