2010-09-22 9 views
9

Sono uno sviluppatore VB.Net, una specie di novizio in C#, Mentre cercavo nella documentazione C# che avevo trovato tra Iterators e Generators, non riuscivo a capire appieno l'uso, Vi sono chiunque che può spiegare (se possibile)Che cosa sono Iteratori e generatori C# e come potrei utilizzarli

+1

Gli iteratori vengono spesso utilizzati per attraversare elenchi di tipi diversi. Iterator sono chiamati Enumerators in .net. Un'altra domanda riguardante gli iteratori: http://stackoverflow.com/questions/1227283/why-do-we-need-iterators-in-c – jgauffin

risposta

14

Iterator sono un modo semplice per generare una sequenza di elementi, senza dover implementare IEnumerable<T>/IEnumerator<T> da soli. Un iteratore è un metodo che restituisce un IEnumerable<T> che è possibile enumerare in un ciclo foreach.

Ecco un semplice esempio:

public IEnumerable<string> GetNames() 
{ 
    yield return "Joe"; 
    yield return "Jack"; 
    yield return "Jane"; 
} 

foreach(string name in GetNames()) 
{ 
    Console.WriteLine(name); 
} 

Nota le yield return dichiarazioni: queste affermazioni in realtà non restituito dal metodo, hanno solo "spingere" l'elemento successivo a chi sta leggendo l'attuazione.

Quando il compilatore rileva un blocco iteratore, in realtà lo riscrive su una macchina a stati in una classe che implementa IEnumerable<T> e IEnumerator<T>. Ogni istruzione yield return nell'iteratore corrisponde a uno stato in quella macchina a stati.

Vedere this article di Jon Skeet per ulteriori dettagli sugli iteratori.

+0

Sarebbe utile vedere un esempio di quando potrebbe essere necessario farlo. Il tuo semplice esempio qui potrebbe essere semplicemente sostituito con una serie di stringhe, se l'obiettivo è solo quello di consentire l'enumerazione su "Joe" "Jack" e "Jane"? – MarkJ

+0

Sì, questo esempio non è molto utile, potresti invece usare facilmente un array. Per ulteriori esempi utili, vedere [La serie di Jon Skeet su Reimplementare Linq to Objects] (http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx);) –

Problemi correlati