Si todo lo que sabe es que la colección es un IEnumerable, pero necesita realizar un seguimiento de cuántos elementos ha procesado hasta ahora (y, por lo tanto, el total cuando haya terminado), puede agregar un par de líneas a un bucle básico:
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
}
También puede agregar una variable de índice incremental a un foreach:
var i=0;
foreach(var elem in coll)
{
//do your thing, then...
i++;
}
Si desea que esto se vea más elegante, puede definir uno o dos métodos de extensión para "ocultar" estos detalles:
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()));