C# 按嵌套列表对列表进行分组,并删除与组不对应的元素
假设我有这样的结构(但是C# 按嵌套列表对列表进行分组,并删除与组不对应的元素,c#,linq,group-by,C#,Linq,Group By,假设我有这样的结构(但是A和B都有更多的属性): 作为解决方案,我希望有3个小组: Group 1: [ { "Id": 1, "Name": "A1", "B": [ { "Id": 1,
A
和B
都有更多的属性):
作为解决方案,我希望有3个小组:
Group 1:
[
{
"Id": 1,
"Name": "A1",
"B": [
{
"Id": 1,
"Name": "B1",
"GroupId": 1
},
{
"Id": 2,
"Name": "B2",
"GroupId": 1
}
]
},
{
"Id": 2,
"Name": "A2",
"B": [
{
"Id": 4,
"Name": "B4",
"GroupId": 1
}
]
}
]
Group 2:
[
{
"Id": 1,
"Name": "A1",
"B": [
{
"Id": 3,
"Name": "B3",
"GroupId": 2
}
]
},
{
"Id": 2,
"Name": "A2",
"B": [
{
"Id": 5,
"Name": "B5",
"GroupId": 2
}
]
}
]
Group 3:
[
{
"Id": 2,
"Name": "A2",
"B": [
{
"Id": 6,
"Name": "B6",
"GroupId": 3
}
]
}
]
我发现我可以按B.GroupId
这样分组:
from a in c
from b in a.B
group a by b.GroupId
但是如何除去那些
GroupId
不在相应组中的元素呢?我尝试在foreach
循环中删除它们,但这会将它们从所有组中删除,而不仅仅是从一个组中删除。您可以尝试使用Linq。下面是“GroupBy”的示例
var jsonstring = File.ReadAllText("json1.json");
var objRoot = JsonConvert.DeserializeObject<List<A>>(jsonstring);
var result = objRoot.SelectMany(x => x.B)
.GroupBy(x => x.GroupId)
.ToDictionary(x => x.Key, y => y.ToArray());
var jsonstring=File.ReadAllText(“json1.json”);
var objRoot=JsonConvert.DeserializeObject(jsonstring);
var result=objRoot.SelectMany(x=>x.B)
.GroupBy(x=>x.GroupId)
.ToDictionary(x=>x.Key,y=>y.ToArray());
编辑
var jsonstring=File.ReadAllText(“json1.json”);
var objRoot=JsonConvert.DeserializeObject(jsonstring);
var result=objRoot.SelectMany(AObj=>AObj.B,(AObj,B)=>new{AObj,B})
.GroupBy(BObj=>BObj.B.GroupId)
.ToDictionary(x=>x.Key,y=>y.Select(y=>
新的
{
Id=y.AObj.Id,
Name=y.AObj.Name,
B=新列表{y.B}
}).GroupBy(x=>x.Id).ToList());
WriteLine(JsonConvert.SerializeObject(result));
这只返回每个组的列表。我需要每个组的列表
。@dace,我已经编辑了帖子,所以创建一个新的对象是唯一的方法吗?我希望避免这种情况,因为在我的现实生活中,一个
对象有100多个属性,而且大多数属性都很复杂(对象、列表等)。
from a in c
from b in a.B
group a by b.GroupId
var jsonstring = File.ReadAllText("json1.json");
var objRoot = JsonConvert.DeserializeObject<List<A>>(jsonstring);
var result = objRoot.SelectMany(x => x.B)
.GroupBy(x => x.GroupId)
.ToDictionary(x => x.Key, y => y.ToArray());
var jsonstring = File.ReadAllText("json1.json");
var objRoot = JsonConvert.DeserializeObject<List<A>>(jsonstring);
var result = objRoot.SelectMany(AObj => AObj.B, (AObj, B) => new { AObj, B })
.GroupBy(BObj => BObj.B.GroupId)
.ToDictionary(x => x.Key, y => y.Select(y =>
new A
{
Id = y.AObj.Id,
Name = y.AObj.Name,
B = new List<B> { y.B }
}).GroupBy(x => x.Id).ToList());
Console.WriteLine(JsonConvert.SerializeObject(result));