2008-11-21 2 views
1

Скажем, у меня есть XML-документ, который выглядит следующим образомКак использовать Linq для установки атрибутов, основанные на счетчике

<foo> 
<bar id="9" /> 
<bar id="4" /> 
<bar id="3" /> 
</foo> 

Я хотел бы использовать LINQ для сброса идентификаторов до 0, 1, 2. Что было бы самым простым способом сделать это?

Благодаря

ответ

3
XElement xml = GetXml(); 
var i = 0; 
foreach (var e in xml.Elements("bar")) 
    e.SetAttributeValue("id", i++); 
0

Вы можете сделать это с помощью методов LinQ вместо Еогеасп, но там не так много взрыва на дыбы:

XElement xml = GetXml(); 
int updatedElements = xml.Elements("bar") 
    .Select((x, i) => 
    { 
     x.SetAttributeValue("id", i); 
     return x; 
    }) 
    .Count(); 

Здесь метод Count() необходимо для перечисления запроса. Все, что перечисляет запрос, будет делать.

При использовании Select как мутатор вас беспокоит (как это делает меня), используйте список (T) .ForEach вместо:

XElement xml = GetXml(); 
xml.Elements("bar") 
    .Select((x, i) => new {x, i}) 
    .ToList() 
    .ForEach(a => a.x.SetAttributeValue("id", a.i)); 
+0

В большинстве случаев, мы можем получить более простой код, чем заявление с запросом. Но, похоже, это не так. – 2008-11-24 14:00:37