C# 如何将两个像素与linq select组合?

C# 如何将两个像素与linq select组合?,c#,linq,C#,Linq,我试图将两个元素列表合并为一个: var list1 = XElement.Parse(@"<root><Element name=""foo""> <ChildElement name=""childFoo""> <SubChildElement name=""subChildFoo""

我试图将两个元素列表合并为一个:

var list1 = XElement.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>").XPathSelectElements("Element").ToList();

var list2 = XElement.Parse(@"<root><Element name=""foo"" attr=""fooAtr"" />
                                    <Element name=""bar"" attr=""barAtr"" />
                                    <Element name=""zoo"" attr=""barAtr"" /></root>").XPathSelectElements("Element").ToList();

var res = from e2 in list2
           join e1 in list1
           on e2.Attribute("name").Value equals e1.Attribute("name").Value
           select new XElement(e1.Add(e2.Element("ChildElement")));
var list1=XElement.Parse(@)
).XPathSelectElements(“元素”).ToList();
var list2=XElement.Parse(@)
).XPathSelectElements(“元素”).ToList();
var res=来自列表2中的e2
在列表1中加入e1
在e2上。属性(“名称”)。值等于e1。属性(“名称”)。值
选择新元素(e1.Add(e2.Element(“ChildElement”));
代码无法编译,因为选择错误(XElement.Add()返回void)

如何在选择并返回新的元素(e2和e1中的子元素)中组合两个元素:e1和e2

我想获得以下格式的列表:

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

我会抛弃XPath,使用LINQ to XML查询方法来查找元素。您的
select
需要从第二个元素复制名称和属性,并从第一个元素复制子元素:

var results = from e2 in second.Descendants("Element")
              join e1 in first.Descendants("Element")
                  on (string)e2.Attribute("name") equals (string)e1.Attribute("name")
              select new XElement(e2.Name, e2.Attributes(), e1.Elements());

请参见此处的工作演示:

出现错误的原因是
Select()
操作必须返回一个对象。实际上,您正在尝试在Select()操作中执行foreach,但实际使用的不是foreach。LINQ不包括foreach操作,因为它可能有副作用,所以您应该使用另一种方法


编辑:我最初发布的内容将连接列表,而不是合并它们。我本来想发布另一个答案,但是@Charles Mager发布了一个最简单的解决方案来解决你的问题。我在这里留下这个答案是为了解释为什么您尝试的select语句不能正常工作。

这将把所有元素连接在一起-需要的是问题中显示的合并输出。这正是我想要的,非常有效,因为我可以对e1和e2的属性进行分组,并且仍然使用构造函数。