拥有这种结构的对象:
public class GroupedObject
{
public int id { get; set; }
public string name { get; set; }
public int value { get; set; }
public string color { get; set; }
}
在这里,它按其属性之一id
分组。
var myObj = someResponse
.Select(d => new GroupedObject
{
id = d.id,
name = d.name,
value = d.value,
color = d.color
})
.GroupBy(o => o.id)
.ToDictionary(a => a.Key, a => a.Select(o => o).ToList());
结构是:
id - id, name, value, color
id - id, name, value, color
id - id, name, value, color
我想要做的是再次通过name
对其进行分组,以获得如下的嵌套结构:
id - name - id, name, value, color
- name - id, name, value, color
id - name - id, name, value, color
- name - id, name, value, color
- name - id, name, value, color
- name - id, name, value, color
id - name - id, name, value, color
- name - id, name, value, color
- name - id, name, value, color
试图两次使用GroupBy
不起作用。既不是用ToList
转换它,也不是在那之后进行分组。
var myObj = someResponse
.Select(d => new GroupedObject
{
id = d.id,
name = d.name,
value = d.value,
color = d.color
})
.GroupBy(o => o.id).GroupBy(o => o.name)
.ToDictionary(a => a.Key, a => a.Select(o => o).ToList());
你是在正确的轨道上,但是这里是LINQ实现两个嵌套级别的分组:
someResponse
.Select(d => new GroupedObject
{
id = d.id,
name = d.name,
value = d.value,
color = d.color
})
.GroupBy(o => o.id)
.ToDictionary(
a => a.Key,
a => a.GroupBy(o => o.name).ToDictionary(o => o.Key, o => o));
这将导致类型为:Dictionary<int, Dictionary<string, IGrouping<string, GroupedObject>>>
的对象
考虑到这一点,最后的IGrouping<string, GroupedObject>
类型可以更改/投影到不同的类型,在嵌套的ToDictionary
调用中指定合适的lamda:
例如用ToDictionary(o => o.Key, o => o.ToList())
改变对Dictionary<int, Dictionary<string, List<GroupedObject>>>
的调用结果
使用理解语法可能更容易:
var myObj = from sr in someResponse
.Select(d => new GroupedObject
{
id = d.id,
name = d.name,
value = d.value,
color = d.color
})
group sr by sr.id into g1
select new {
ID = g1.Key,
NamesGroup = from n in g1
group n by n.name into g2
select new {
Name = g2.Key,
...
}
};
注意:如果您从LINQPad.net下载精彩的LINQPad,在Samples中,您会发现使用Northwind示例数据库的非常好的嵌套分组示例。