Расположение XElement при запросе через IEnumerable с использованием LINQ - PullRequest
0 голосов
/ 21 февраля 2010

У меня есть запрос linq, который запрашивает IEnumberable. Когда у меня есть соответствующий элемент для моего предложения where, я хотел бы знать положение элемента в IEnumberable.

var result = from e in elements
             where (string) e.Attribute("class") == "something"
             select e.Position();

e.Position (), конечно, не компилируется. Значение e.Position () будет позицией выбранного элемента в элементах IEnumberable.

Есть идеи, как это сделать?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2010

Вам необходимо использовать перегруженный метод Select , который позволяет индексировать, поскольку эта возможность недоступна в синтаксисе запроса.

elements.Select((e, i) => new { Element = e, Index = i })
        .Where(item => (string)item.Element.Attribute("class") == "something")
        .Select(item => item.Index);
0 голосов
/ 21 февраля 2010

Если вы используете .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 (это я и сделал), или вы можете использовать анонимный тип.

...