尝试使用linq创建分组记录

时间:2017-02-04 15:05:12

标签: c# .net linq

我在1个列表中有这样的记录:

Id     Title     Name      Basic     Message
10     Stats2    abc       10         sldjs
10     Stats2    pqr       20         sldjs
10     Stats2    xyz       30         sldjs
10     Stats2    abc       40         sldjs


11     Stats3    aaa       0         sldjs
11     Stats3    bbb       0         sldjs
11     Stats3    ccc       0         sldjs
11     Stats3    ddd       0         sldjs

我有一个类型列表的变量,它包含以下记录:

var list = new List<Stats>();//this variable hold all above records.

现在我正尝试从列表变量中创建如下记录:

[0]:Stats2:
        abc         
            10  sldjs
            40  sldjs
        pqr
            20  sldjs
        xyz
            30  sldjs

[1]:Stats3:
        aaa         
            0  sldjs
        bbb
            0  sldjs
        ccc
            0  sldjs
        ddd 
            0  sldjs

这就是我的尝试,但没有得到如何创建内部嵌套子项,如(上面显示的2个abc记录):

var data =list.GroupBy(ed =>ed.Id)
               .Select
               (

               )

2 个答案:

答案 0 :(得分:2)

var data =list.GroupBy(p => p.Title).Select(p => new
            {
                Title = p.Key,
                Items = p.GroupBy(q => q.Name)
                         .ToDictionary(q => q, q => new { q.Basic, q.Message })
            });

答案 1 :(得分:2)

您还需要对内部记录进行分组。结果可能类似于Dictionary<int, Dictionary<string, List<Stats>>>。外部字典的键是ID值,内部键是Name值,值是Stats的列表Title和{{1} }}:

Name

您可以访问结果中的值:

var result = list.GroupBy(rec => rec.ID)
                 .ToDictionary(
                     group => group.Key,
                     group => group.GroupBy(stat => stat.Name)
                                   .ToDictionary(g => g.Key, g => g.ToList())
                              );

上面的例子是一个包含result[10]["abc"] Stats 10和40的列表。

如果您只想在最终记录中保留BasicBasic,则可以使用MessageSelect投影到匿名类型:

Stats