Se tudo o que você sabe é que a coleção é um IEnumerable, mas precisa acompanhar quantos elementos você processou até o momento (e, portanto, o total quando terminar), você pode adicionar algumas linhas a um loop for 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
}
Você também pode adicionar uma variável de índice incrementada a um foreach:
var i=0;
foreach(var elem in coll)
{
//do your thing, then...
i++;
}
Se você deseja que isso pareça mais elegante, você pode definir um método de extensão ou dois para "ocultar" esses detalhes:
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()));