Если все, что вы знаете, это то, что коллекция является IEnumerable, но вам нужно отслеживать, сколько элементов вы обработали до сих пор (и, следовательно, общее количество, когда вы закончите), вы можете добавить пару строк в базовый цикл for:
var coll = GetMyCollectionAsAnIEnumerable();
var idx = 0;
for(var e = coll.GetEnumerator(); e.MoveNext(); idx++)
{
var elem = e.Current;
//use elem and idx as you please
}
Вы также можете добавить инкрементную переменную индекса в foreach:
var i=0;
foreach(var elem in coll)
{
//do your thing, then...
i++;
}
Если вы хотите, чтобы это выглядело более элегантно, вы можете определить метод расширения или два, чтобы «скрыть» эти детали:
public static void ForEach<T>(this IEnumerable<T> input, Action<T> action)
{
foreach(T elem in input)
action(elem);
}
public static void ForEach<T>(this IEnumerable<T> input, Action<T, int> action)
{
var idx = 0;
foreach(T elem in input)
action(elem, idx++); //post-increment happens after parameter-passing
}
//usage of the index-supporting method
coll.ForEach((e, i)=>Console.WriteLine("Element " + (i+1) + ": " + e.ToString()));