Se tutto quello che sai è che la raccolta è un oggetto IEnumerable, ma devi tenere traccia di quanti elementi hai elaborato finora (e quindi il totale quando hai finito), puoi aggiungere un paio di linee a un basic per loop:
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
}
Puoi anche aggiungere una variabile di indice incrementata a un foreach:
var i=0;
foreach(var elem in coll)
{
//do your thing, then...
i++;
}
Se vuoi rendere questo aspetto più elegante, puoi definire un metodo di estensione o due per "nascondere" questi dettagli:
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()));