Linq to XML присоединиться и добавить данные? - PullRequest
4 голосов
/ 28 марта 2011

Учитывая XML, как это:

<Root>
    <Element>
        <Id>1</Id>
    </Element>
    <Element>
        <Id>2</Id>
    </Element>
    <Element>
        <Id>3</Id>
    </Element>
</Root>

И IEnumerable с этими данными:

[0] = { Id = 1, Data = 429 }
[1] = { Id = 2, Data = 271 }
[2] = { Id = 3, Data = 328 }

Существует ли элегантный способ использования LINQ to XML для объединения данных IEnumerable с XML на основе общего Id без индивидуального запроса каждого элемента для связи данных?

Таким образом, результат будет выглядеть так:

<Root>
    <Element>
        <Id>1</Id>
        <Data>429</Data>
    </Element>
    <Element>
        <Id>2</Id>
        <Data>271</Data>
    </Element>
    <Element>
        <Id>3</Id>
        <Data>328</Data>
    </Element>
</Root>

Единственное, что я могу придумать, это что-то вроде этого, но я надеялся, что есть более чистый метод:

foreach(var d in MyIEnumerable)
{
    XElement element = (from x in MyXDoc.Elements("Element")
                        where x.Element("Id").Value == d.Id
                        select x).Single();

    element.Add(new XElement("Data", d.Data));
}

Ответы [ 2 ]

3 голосов
/ 28 марта 2011

Одним из способов является использование Tuple<Element, XElement>.(Element - это класс, в котором есть идентификатор и данные.)

var output = from el in els
             join xmlEl in xdoc.Root.Elements("Element") on el.Id equals int.Parse(xmlEl.Element("Id").Value)
             select new Tuple<Element, XElement>(el, xmlEl);

foreach(var item in output)
{
    item.Item2.Add(new XElement("Data", item.Item1.Data));
}

Если у вас нет кортежей, вы можете вместо этого создать анонимный класс.

select new {ObjEl = el, XmlEl = xmlEl}
1 голос
/ 28 марта 2011

Вы можете сделать что-то вроде:

var elements = MyXDoc.Elements("Element");
elements.Apply(e => e.Add(new XElement("Data", MyIEnumerable.FirstOrDefault(d => d.Id == e.Element("Id").Value).Data)));            

Где метод расширения Apply определяется как:

public static class Extensions
{
    public static void Apply<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        foreach (var item in enumerable)
        {
            action(item);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...