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