Если вы используете .NET 4.0, вы можете использовать (новый) метод Zip
и написать то же самое, используя синтаксис запроса. Он создает некоторые временные объекты, поэтому он не так эффективен, но некоторые люди могут найти его более читабельным:
var result = from e in elements.Zip
(Enumerable.Range(0, elements.Count()), Tuple.Create)
where (string)e.Item1.Attribute("class") == "something"
select e.Item2;
Зиппизирует входную коллекцию с сгенерированной последовательностью чисел (с тем же диапазоном, что и длина коллекции). Затем вы можете сохранить объединенное значение, используя класс Tuple
(это я и сделал), или вы можете использовать анонимный тип.