Al programmatore le collezioni servono sempre per essere enumerate. E per farlo semplicemente da sempre si utilizzano strategie per utilizzare enumeratori standard piuttosto che conoscere puntulamente l'implementazione della classe collezione di riferimento.
RequisitiUna collection per essere enumerabile deve implementare l'interfaccia IEnumerable (o la sua versione generic IEnumerable<T>) ed esporre il metodo:
IEnumerator GetEnumerator();
object Current { get; } bool MoveNext(); void Reset();
List<string> messaggi=new List<string>(); IEnumerator<string> en = messaggi.GetEnumerator(); while (en.MoveNext()) { Console.WriteLine(en.Current); }
List<string> messaggi=new List<string>(); foreach (var item in messaggi) { Console.WriteLine(item); }
Iteratori e istruzione yieldL'iteratore è un enumeratore generato dal compilatore. Molti esempi possono portare confusione perciò partiamo da un problema matematico: come creare la collection "tutti i numeri naturali"? A primo sguardo uno potrebbe dire "impossibile, non è decidibile come problema". Infatti, è vero: tuttavia possiamo definire una collection (solamente definirla) e poi lasciare che venga di fatto costruita in fase di runtime.
static IEnumerable<int> GetNaturals() { int i = 0; while (true) { yield return i; i++; } }
static void Main(string[] args) { foreach (var item in GetNaturals()) { Console.WriteLine(item); } }