Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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# 反转LINQ中的嵌套集合_C#_Linq - Fatal编程技术网

C# 反转LINQ中的嵌套集合

C# 反转LINQ中的嵌套集合,c#,linq,C#,Linq,有一个类型a的列表,每个都包含一个类型B的列表,获得所有类型B的列表的最佳方法是什么,每个类型B都包含它们所属的类型a的列表 具有如下列表: var parents = new List<Parent> { { new Parent { ID = 1, Childs = new List<Child> { { new Child

有一个类型a的列表,每个都包含一个类型B的列表,获得所有类型B的列表的最佳方法是什么,每个类型B都包含它们所属的类型a的列表

具有如下列表:

var parents = new List<Parent> {
    {
        new Parent {
            ID = 1,
            Childs = new List<Child> {
                {
                    new Child {
                        ID = 1
                    }
                },
                {
                    new Child {
                        ID = 2
                    }
                },
                {
                    new Child {
                        ID = 3
                    }
                }
            }
        }                    
    },
    {
        new Parent {
            ID = 2,
            Childs = new List<Child> {
                {
                    new Child {
                        ID = 3
                    }
                },
                {
                    new Child {
                        ID = 4
                    }
                },
                {
                    new Child {
                        ID = 5
                    }
                }
            }
        }                    
    }
};
编辑:我尝试了一种方法,首先使用
SelectMany
Distinct
将孩子展平,但不确定如何再次将其链接到家长:

var foo =
    from childId in parents.SelectMany(x => x.Childs).Select(x => x.ID).Distinct()
    select
        new
        {
            childId = childId,
            inParent = // Missing Part
        };

您可以将大问题分为两个更简单的问题:

  • 为每个父/子对创建一个匿名对象,包含对父对象和子对象的引用。您可以使用带有两个
    from
    子句的简单LINQ查询

  • 将这些对象分组到所需的表达中。
    groupby
    子句是您在这里的朋友


  • 我想,如果您希望存储树状结构,您应该尝试更改数据模型,在这种情况下,您应该始终使用带有自定义对象的单链表,并以类似于存储在数据库中的方式嵌套引用相应的父/子对象


    这是处理此类数据结构的理想方法,否则将导致许多嵌套查询。

    您必须先使用
    选择many
    将其展平,然后使用
    GroupBy
    按子id和
    字符串分组。连接
    以连接每个父id:

    var childParents = parents
        .SelectMany(p => p.Childs.Select(c => new {Parent = p, Child = c}))
        .GroupBy(x => x.Child.ID)
        .Select(g => new
        {
            Child = g.Key,
            InParent = String.Join(", ", g.Select(x => x.Parent.ID))
        });
    
    结果:

    如果您确实不希望
    InParent
    属性是一个字符串,而是一个
    列表(或数组),请使用以下命令:

    .....
    InParent = g.Select(x => x.Parent.ID).ToList()  // or ToArray()
    

    问问题之前你试过什么吗?你的问题是什么?当然,我尝试用SelectMany/Distinct将孩子们展平,它返回所有相关孩子的独特列表,但与他们所属的家长没有联系。当然,我可以通过循环进行迭代,我的问题是如何在LINQ查询中实现这一点。
    .....
    InParent = g.Select(x => x.Parent.ID).ToList()  // or ToArray()