最优雅的方式是什么:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar baz="wii" date="2009-01-01">
<baz value="0" />
<baz value="1" />
</bar>
<bar baz="wii" date="2009-01-02">
<baz value="0" />
<baz value="1" />
</bar>
<bar baz="xbox" date="2009-01-01">
<baz value="0" />
<baz value="1" />
</bar>
<bar baz="xbox" date="2009-01-02">
<baz value="0" />
<baz value="1" />
</bar>
</foo>
到此:
<foo>
<bar baz="wii" date="2009-01-02">
<baz value="0" />
<baz value="1" />
</bar>
<bar baz="xbox" date="2009-01-02">
<baz value="0" />
<baz value="1" />
</bar>
</foo>
理想情况下,这是一个采用“日期”参数的函数。明显创建<foo/>
并循环以从返回<bar>
的表达式中添加每个IEnumerable<XElement>
看起来很笨拙,所以可能有更好的方法。
答案 0 :(得分:0)
我认为你所描述的显而易见的方式实际上是最好的。纯LINQ方法看起来像
private static XDocument FilterByDate(XDocument doc, DateTime dateTime)
{
return doc.Root.Elements()
.Where(xe => DateTime.Parse(xe.Attribute("date").Value) == dateTime)
.Aggregate(new XDocument(new XElement("foo")),
(xd, xe) => { xd.Root.Add(xe); return xd; });
}
但我认为Aggregate部分效率不高。