C# 如何使用Linq合并两个像素列表?

C# 如何使用Linq合并两个像素列表?,c#,linq,C#,Linq,我正在尝试合并两个元素列表,如下所示: 清单1: <Element name="foo"> <ChildElement name="childFoo"> <SubChildElement name="subChildFoo" /> </ChildElement> </Element> <Element name="bar"> <ChildElement name="childBa

我正在尝试合并两个元素列表,如下所示:

清单1:

<Element name="foo">
    <ChildElement name="childFoo">
        <SubChildElement name="subChildFoo" />
    </ChildElement>
</Element>
<Element name="bar">
    <ChildElement name="childBar">
        <SubChildElement name="subChildBar" />
    </ChildElement>
</Element>
<Element name="zoo" />

我想将具有相同名称属性的元素组合成一个元素。我如何使用linq实现这一点?

也许一个连接就可以做到:

var res = from e2 in list2
        join e1 in list1 on e2.name equals e1.name into joined
        from j in joined.DefaultIfEmpty() 
            select new Element
            {
                name = j.name, 
                attr = j.attr, 
                ChildElement = j.ChildElement 
            };

您能否将
list2
编入词典,并将属性应用于
list1

var doc1 = XDocument.Parse(@"
    <root>
        <Element name=""foo"">
            <ChildElement name=""childFoo"">
                <SubChildElement name=""subChildFoo"" />
            </ChildElement>
        </Element>
        <Element name=""bar"">
            <ChildElement name=""childBar"">
                <SubChildElement name=""subChildBar"" />
            </ChildElement>
        </Element>
        <Element name=""zoo"" />
    </root>");

var doc2 = XDocument.Parse(@"
    <root>
        <Element name=""foo"" attr=""fooAtr"" />
        <Element name=""bar"" attr=""barAtr"" />
        <Element name=""zoo"" attr=""barAtr"" />
    </root>");

var attributes = doc2.Descendants("Element")
    .ToDictionary(e => e.Attribute("name").Value, e => e.Attribute("attr").Value);
doc1.Descendants("Element")
    .ToList()
    .ForEach(e => e.Add(new XAttribute("attr", attributes[e.Attribute("name").Value])));
Console.WriteLine(doc1);
var doc1=XDocument.Parse(@)
");
var doc2=XDocument.Parse(@)
");
var attributes=doc2.子体(“元素”)
.ToDictionary(e=>e.Attribute(“name”).Value,e=>e.Attribute(“attr”).Value);
doc1.子体(“元素”)
托利斯先生()
.ForEach(e=>e.Add(新的XAttribute(“attr”,attributes[e.Attribute(“name”).Value]));
控制台写入线(doc1);
输出:

<root>
  <Element name="foo" attr="fooAtr">
    <ChildElement name="childFoo">
      <SubChildElement name="subChildFoo" />
    </ChildElement>
  </Element>
  <Element name="bar" attr="barAtr">
    <ChildElement name="childBar">
      <SubChildElement name="subChildBar" />
    </ChildElement>
  </Element>
  <Element name="zoo" attr="barAtr" />
</root>


这不起作用有两个原因:错误的“左连接”语法,e1.name应该是e1.Attribute(“name”).Value,这不是创建新XElement的方式。嗯,我想使用连接和选择,但这也可以。谢谢
var res = from e2 in list2
        join e1 in list1 on e2.name equals e1.name into joined
        from j in joined.DefaultIfEmpty() 
            select new Element
            {
                name = j.name, 
                attr = j.attr, 
                ChildElement = j.ChildElement 
            };
var doc1 = XDocument.Parse(@"
    <root>
        <Element name=""foo"">
            <ChildElement name=""childFoo"">
                <SubChildElement name=""subChildFoo"" />
            </ChildElement>
        </Element>
        <Element name=""bar"">
            <ChildElement name=""childBar"">
                <SubChildElement name=""subChildBar"" />
            </ChildElement>
        </Element>
        <Element name=""zoo"" />
    </root>");

var doc2 = XDocument.Parse(@"
    <root>
        <Element name=""foo"" attr=""fooAtr"" />
        <Element name=""bar"" attr=""barAtr"" />
        <Element name=""zoo"" attr=""barAtr"" />
    </root>");

var attributes = doc2.Descendants("Element")
    .ToDictionary(e => e.Attribute("name").Value, e => e.Attribute("attr").Value);
doc1.Descendants("Element")
    .ToList()
    .ForEach(e => e.Add(new XAttribute("attr", attributes[e.Attribute("name").Value])));
Console.WriteLine(doc1);
<root>
  <Element name="foo" attr="fooAtr">
    <ChildElement name="childFoo">
      <SubChildElement name="subChildFoo" />
    </ChildElement>
  </Element>
  <Element name="bar" attr="barAtr">
    <ChildElement name="childBar">
      <SubChildElement name="subChildBar" />
    </ChildElement>
  </Element>
  <Element name="zoo" attr="barAtr" />
</root>