C# 展平父/子层次结构

C# 展平父/子层次结构,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我在这里试图理解一个概念: 从一个对象结构,如 class Parent { public string ParentID { get; set; } public List<Child> Children { get; set; } } class Child { public string ChildID { get; set; } } 我期待3个映射: <Mapping ID='Parent1' ChildID='Child1' /> &

我在这里试图理解一个概念:

从一个对象结构,如

class Parent
{
    public string ParentID { get; set; }
    public List<Child> Children { get; set; } 
}

class Child
{
   public string ChildID { get; set; }
}
我期待3个映射:

<Mapping ID='Parent1' ChildID='Child1' />
<Mapping ID='Parent1' ChildID='Child2' />
<Mapping ID='Parent1' ChildID='Child3' />

编辑

以下代码将展平层次结构:

var list = new List<Parent>
{
    new Parent
    {
        ParentID = "parentID1",
        Children = new List<Child> {new Child {ChildID = "childID1"}, new Child {ChildID = "childID2"}}
    },
    new Parent
    {
        ParentID = "parentID2",
        Children = new List<Child> {new Child {ChildID = "childID3"}, new Child {ChildID = "childID4"}}
    }
};

IEnumerable<XElement> list1 = (from parent in list
    from child in parent.Children
    select
        new XElement("Mapping", new XAttribute("ID", parent.ParentID),
            new XAttribute("ChildID", child.ChildID)));

string @join = string.Join(Environment.NewLine, list1);
结果:不是你所期望的,对吧

<Mapping ID="parentID1" ChildID_0="childID1" ChildID_1="childID2" />
<Mapping ID="parentID2" ChildID_0="childID3" ChildID_1="childID4" />

我为什么使用此重载?

因为父母有一个孩子的列表,而第一个代码只适用于一个孩子,而不适用于很多孩子

结论:

不确定你想要实现什么


为什么不保持对象的当前结构?

假设父对象已完全填充,如何发布它?我不明白您希望看到什么。这是一个概念性问题。将填充ParentID和ChildID值的实际字符串文字对于解决方案来说无关紧要。因此,没有什么可发布的。到目前为止,您在尝试生成这种类型的文件时尝试了什么?具体来说,您在该实现中遇到了什么问题?我不知道如何用linq到xml语法有效地构建它,因为在创建第一个“映射”元素时,我需要为每个条目提供一个ChildID值,但是我不知道如何用语法来表达它,似乎编辑这个问题标题的天才设法删除了大量上下文,那就是我想要一个linq到xml语法的解决方案。提供一个输入和输出示例就足够了。我试图从上面对象中组织的数据中获取我发布的示例XML,本质上是一个(ParentID,ChildID)映射。不幸的是,更改数据结构或XML格式都不是一个选项。好吧,但正如我在回答中所解释的,保持这种结构不会对多个孩子起作用,或者您是否希望生成许多映射,例如Parent1->Child1,Parent1->Child2作为输出?有效地将层次结构扁平化并获取所有行:我在原始帖子中包含了一个示例作为编辑。好的,看看我的编辑。感谢帮助,我来这里是想找出一些不赢得本月问题的东西,尽管我仍然不知道发生了什么。
var list = new List<Parent>
{
    new Parent
    {
        ParentID = "parentID1",
        Children = new List<Child> {new Child {ChildID = "childID1"}, new Child {ChildID = "childID2"}}
    },
    new Parent
    {
        ParentID = "parentID2",
        Children = new List<Child> {new Child {ChildID = "childID3"}, new Child {ChildID = "childID4"}}
    }
};

IEnumerable<XElement> list1 = (from parent in list
    from child in parent.Children
    select
        new XElement("Mapping", new XAttribute("ID", parent.ParentID),
            new XAttribute("ChildID", child.ChildID)));

string @join = string.Join(Environment.NewLine, list1);
<Mapping ID="parentID1" ChildID="childID1" />
<Mapping ID="parentID1" ChildID="childID2" />
<Mapping ID="parentID2" ChildID="childID3" />
<Mapping ID="parentID2" ChildID="childID4" />
List<Parent> list = new List<Parent>
{
    new Parent() {ParentID = "parentID1", Children = new List<Child>() {new Child() {ChildID = "childID1"},new Child() {ChildID = "childID2"}}},
    new Parent() {ParentID = "parentID2", Children = new List<Child>() {new Child() {ChildID = "childID3"},new Child() {ChildID = "childID4"}}}
    };
IEnumerable<string> enumerable = xElements.Select(s => s.ToString());


IEnumerable<XElement> xElements = list.Select(s => new XElement("Mapping", new XAttribute("ID", s.ParentID), s.Children.Select(t => new XAttribute("ChildID", t.ChildID))));
IEnumerable<string> enumerable = xElements.Select(s => s.ToString());
var @join = string.Join(Environment.NewLine, enumerable);
var list = new List<Parent>
{
    new Parent
    {
        ParentID = "parentID1",
        Children = new List<Child> {new Child {ChildID = "childID1"}, new Child {ChildID = "childID2"}}
    },
    new Parent
    {
        ParentID = "parentID2",
        Children = new List<Child> {new Child {ChildID = "childID3"}, new Child {ChildID = "childID4"}}
    }
};

IEnumerable<XElement> xElements =
    list.Select(
        s =>
            new XElement("Mapping", new XAttribute("ID", s.ParentID),
                s.Children.Select((t, u) => new XAttribute(string.Format("ChildID_{0}", u), t.ChildID))));
var @join = string.Join(Environment.NewLine,xElements);
<Mapping ID="parentID1" ChildID_0="childID1" ChildID_1="childID2" />
<Mapping ID="parentID2" ChildID_0="childID3" ChildID_1="childID4" />