C# 尝试使用linq创建分组记录

C# 尝试使用linq创建分组记录,c#,.net,linq,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 Stats

我在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.
这就是我如何尝试但没有得到如何创建内部嵌套子项的方法,例如(2条abc记录,如上所示)):


您还需要对内部记录进行分组。结果可能类似于一个
字典
。外部字典的键将是
ID
值,内部键将是
Name
值,这些值将是具有
标题和
名称的
Stats
列表:

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
Basic
10和40的列表


如果您只想在最终记录中保留
Basic
Message
,可以使用
Select
Stats
投影到匿名类型:

var result = list.GroupBy(rec => rec.ID)
                 .ToDictionary(
                     group => group.Key,
                     group => group.GroupBy(stat => stat.Name)
                                   .ToDictionary(g => g.Key, g => g.Select(stat => new {stat.Title, stat.Basic, stat.Message}).ToList())
                              );

您还需要对内部记录进行分组。结果可能类似于一个
字典
。外部字典的键将是
ID
值,内部键将是
Name
值,这些值将是具有
标题和
名称的
Stats
列表:

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
Basic
10和40的列表


如果您只想在最终记录中保留
Basic
Message
,可以使用
Select
Stats
投影到匿名类型:

var result = list.GroupBy(rec => rec.ID)
                 .ToDictionary(
                     group => group.Key,
                     group => group.GroupBy(stat => stat.Name)
                                   .ToDictionary(g => g.Key, g => g.Select(stat => new {stat.Title, stat.Basic, stat.Message}).ToList())
                              );


你不认为你的第一个组员应该在Id而不是标题上吗?@如果你期望在问题中显示结果,就不要学习。您的示例结果首先按
Title
分组,然后按
Name
分组,而不是按
ID
@Learning分组。我刚刚意识到(巧合地?)这些分组是相同的,至少对于您的示例数据是一样的。所有
Stats2
都有
ID
10,但我看不出在原始数据中是否总是这样。但在您的示例结果中,您使用了
Title
作为键,这也是我使用它的原因。我对您为帮助我所做的努力投了赞成票,但我担心的是,如果我有id为12且标题相同的记录,那么我希望有3个结果:[0]:Stats2[1]:Stats3[2]:Stats2@Learing好的,我更新我的答案…只需使用ID而不是标题。你不认为你的第一组成员应该在ID而不是标题上吗?@如果你期望问题中显示的结果,就不会学习。您的示例结果首先按
Title
分组,然后按
Name
分组,而不是按
ID
@Learning分组。我刚刚意识到(巧合地?)这些分组是相同的,至少对于您的示例数据是一样的。所有
Stats2
都有
ID
10,但我看不出在原始数据中是否总是这样。但在您的示例结果中,您使用了
Title
作为键,这也是我使用它的原因。我对您为帮助我所做的努力投了赞成票,但我担心的是,如果我有id为12且标题相同的记录,那么我希望有3个结果:[0]:Stats2[1]:Stats3[2]:Stats2@Learing好的,我更新我的答案…只需使用ID而不是标题。你不认为你的第一组成员应该使用ID而不是标题吗?@Learning,根据您的输出,您将结果与标题分组,我也是。对于您为帮助我所做的努力,我投了赞成票,但我担心,如果我有id为12且标题相同的记录Stats2,那么我希望有3个结果:[0]:Stats2[1]:Stats3[2]:Stats2非常感谢您的回答,请继续这样帮助:)您不认为您的第一组成员应该在Id而不是标题上吗?@Learning,根据您的输出,您将结果与标题分组。我也是。对于您为帮助我所做的努力,我投了赞成票,但我担心,如果我有id为12且标题相同的记录,那么我希望有3个结果:[0]:Stats2[1]:Stats3[2]:Stats2非常感谢您的回答,请继续这样帮助:)