Как аккуратно удалить узлы из XDocument, используя LINQ и Lambda? - PullRequest
0 голосов
/ 07 июля 2010

Какой самый элегантный способ из этого:

<?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>

В идеале это функция, принимающая параметр date. Очевидное создание <foo/> и циклическое добавление каждого <bar> из выражения, которое возвращает IEnumerable<XElement>, кажется неуклюжим, поэтому, вероятно, есть более хороший способ.

1 Ответ

0 голосов
/ 07 июля 2010

Я думаю, очевидный способ, которым вы описываете, на самом деле лучший.Чистый подход 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; });
}

Но я думаю, что агрегатная часть не очень эффективна.

...