Как использовать индекс/позицию с Where в языке запросов LINQ?

Есть ли возможность написать это с использованием языка запросов... не цепочку методов?

 notifications.Where((n, index) => n.EventId == m_lastSelectedEventID)
              .Select((n, index) => new {Position = index}).FirstOrDefault();

Спасибо, Radu

Ответ 1

Нет, синтаксис выражения запроса не поддерживает те перегрузки, которые я боюсь.

С другой стороны, если вы используете функцию "Перегрузка" явно один раз в начале, чтобы создать анонимный тип с индексом и значением, вы можете использовать эту последовательность пар в выражении запроса. Например:

var query = from pair in sequence.Select((value, index) => new { value, index })
            where pair.index % 3 == 0
            select string.Format("{0}: {1}", pair.index, pair.value);

EDIT: обратите внимание, что в вашем примере кода вы всегда фильтруете сначала, а затем берете индекс первой записи в последовательности результатов. Этот индекс всегда будет равен 0. Если вы действительно хотите найти исходный индекс выбранного идентификатора внутри notifications, я подозреваю, что вы действительно хотите:

int? index = notifications.Select((n, index) => new { n, index })
                          .Where(pair => pair.n.EventId == m_lastSelectedEventID)
                          .Select(pair => (int?) pair.index)
                          .FirstOrDefault();

(Это вернет a Nullable<int> из null, если не найден.)