如何使用LINQ和Lambda从XDocument中整齐地删除节点?

时间:2010-07-07 12:22:49

标签: lambda linq-to-xml

最优雅的方式是什么:

<?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>看起来很笨拙,所以可能有更好的方法。

1 个答案:

答案 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部分效率不高。