Linq to xml и счетчики в нескольких проекциях - PullRequest
1 голос
/ 09 февраля 2010

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

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

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

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

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

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


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

т.е.

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>

1 Ответ

1 голос
/ 09 февраля 2010

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

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

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

...