Вы можете сделать это с помощью методов 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));