Скажем, у меня есть XML-документ, который выглядит так
<foo>
<bar id = "9" />
<bar id = "4" />
<bar id = "3" />
</foo>
Я хотел бы использовать linq для сброса идентификатора на 0, 1, 2. Как это сделать проще всего?
Спасибо





XElement xml = GetXml();
var i = 0;
foreach (var e in xml.Elements("bar"))
e.SetAttributeValue("id", i++);
Вы можете сделать это с помощью методов linq вместо foreach, но это не так уж важно:
XElement xml = GetXml();
int updatedElements = xml.Elements("bar")
.Select((x, i) =>
{
x.SetAttributeValue("id", i);
return x;
})
.Count();
Здесь метод Count () необходим для перечисления запроса. Все, что перечисляет запрос, подойдет.
Если использование Select в качестве мутатора вас беспокоит (как и меня), используйте вместо него List (T) .ForEach:
XElement xml = GetXml();
xml.Elements("bar")
.Select( (x, i) => new {x, i})
.ToList()
.ForEach(a => a.x.SetAttributeValue("id", a.i));
Конечно, методы функционального программирования не так хороши для создания побочных эффектов.
В большинстве случаев мы можем получить более простой код, чем оператор с запросом. Но, похоже, не в этом случае.