Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按嵌套列表对列表进行分组,并删除与组不对应的元素_C#_Linq_Group By - Fatal编程技术网

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));