Linq to xml и счетчики в нескольких проекциях

Аналогично этому вопросу:

LINQ, итераторы, выбор и проекция

Я хочу использовать счетчик или инкрементную переменную в проекции, однако я хочу использовать один и тот же счетчик в нескольких проекциях. Я создаю XML-документ, используя несколько проекций на основе разных источников данных, но мне нужно поддерживать узел «id» (где id — это увеличивающееся значение).

Я могу добиться этого для одной проекции, используя что-то похожее на

Dim x as New XElement("rootNode", list.Select(Of XElement)(Function(xe, count) new XElement("blah", count+1)))

Затем я хочу добавить еще одну группу XElements в корень, продолжая счетчик от предыдущего значения


Редактировать: Примечание. Вышеприведенное, возможно, не очень хорошо описывает мою проблему. Я хочу опросить XML-документ (который был представлен в списке выше) и на основе одного набора узлов добавить несколько новых узлов в другой документ. Затем опросите документ на наличие другого набора узлов и добавьте еще несколько новых узлов в другой документ, поддерживая увеличивающийся счетчик для обоих наборов.

i.e.

Dim orig = <root>
                       <itemtype1>
                           <item>
                               <name>test</name>
                               <age>12</age>
                           </item>
                           <item>
                               <name>test2</name>
                               <age>13</age>
                           </item>
                       </itemtype1>
                       <itemtype2>
                           <item>
                               <name>testing</name>
                               <age>15</age>
                           </item>
                           <item>
                               <name>testing</name>
                               <age>14</age>
                           </item>
                       </itemtype2>
                   </root>

    Dim newX As New XElement("test", orig.Descendants("itemtype1"). _
                             Descendants("item").Select(Of XElement)(Function(xe, count) New XElement("blah", New XElement("id", count))), _
                                                        orig.Descendants("itemtype2"). _
                             Descendants("item").Select(Of XElement)(Function(xe, count) New XElement("blah", New XElement("id", count))))

В идеале это должно вывести:

 <test>
  <blah>
    <id>0</id>
  </blah>
  <blah>
    <id>1</id>
  </blah>
  <blah>
    <id>2</id>
  </blah>
  <blah>
    <id>3</id>
  </blah>
</test>

person hitch    schedule 09.02.2010    source источник
comment
Любые другие предложения о том, как лучше всего реализовать это?   -  person hitch    schedule 18.02.2010


Ответы (1)


Самый простой способ — объединить ваши две последовательности:

Dim x as New XElement("rootNode", list.Concat(list2) _
                                      .Select(Of XElement)(Function(xe, count) _
                                          New XElement(xe, count + 1)) _
                     )

(Отформатировано для удобочитаемости.)

person jason    schedule 09.02.2010