Попробуйте следующее
foreach ( var item in numbers.Select( (x,i) => new { Index = i, Value = x })) {
var index = item.Index;
var value = item.Value;
...
}
Существует перегрузка выбора, которая передается по индексу элемента. Этот код создаст новый анонимный тип для каждого элемента, который включает в себя как индекс, так и значение.
Вот альтернативный способ, который делает синтаксис немного более читабельным.
public static void ForEach<T>(this IEnumerable<T> source, Action<T,int> del) {
int i = 0;
foreach ( var cur in source ) {
del(cur, i);
i++;
}
}
numbers.ForEach( (x,i) =>
{
// x is the value and i is the index
}
Это не добавляет много к определению локального и увеличивает его вручную. Есть ли конкретная причина, по которой вы не хотите делать это таким образом?