Implementazione di IEnumerator senza utilizzare "yield return" in c #

0

Sono nuovo nella programmazione in C #, stavo sperimentando il concetto degli iteratori in C #. Qui, sto cercando di visualizzare tutti i termini in una lista, per questo sto provando diversi modi per ottenere i risultati. Nel codice seguente, sto usando due classi ListIterator e ImplementList.

In ListIterator class : ho definito un HashSet e utilizza IEnumerator per memorizzare i valori. Qui il metodo GetEnumerator() restituisce i valori nell'elenco. GetEnumerator è implementato in ImplementList class (altra classe). Infine, l'elenco viene visualizzato nella console.

public class ListIterator
{ 
   public void DisplayList()
   {
    HashSet<int> myhashSet = new HashSet<int> { 30, 4, 27, 35, 96, 34};
    IEnumerator<int> IE = myhashSet.GetEnumerator();
    while (IE.MoveNext())
      {
        int x = IE.Current;
        Console.Write("{0} ", x);
      }
      Console.WriteLine();
    Console.ReadKey();
   }
}

Nella classe ImplementList: GetEnumerator() è definito e restituisce l'elenco utilizzando yield return x.

public class ImplementList : IList<int>
  {
    private List<int> Mylist = new List<int>();
    public ImplementList() { }

    public void Add(int item) 
    { 
        Mylist.Add(item); 
    }

    public IEnumerator<int> GetEnumerator()
    {
      foreach (int x in Mylist)
        yield return x;
    }
  }

Ora, voglio riscrivere GetEnumerator() senza usare yield return . E dovrebbe restituire tutti i valori in una lista. Ho provato a utilizzare per il ciclo come for(int x=0; x<Mylist.Count; x++) , ma non restituisce tutti i valori nell'elenco.

È possibile ottenere tutti i valori nell'elenco senza utilizzare yield return in IEnumerator

    
posta GIRI 21.07.2014 - 19:52
fonte

1 risposta

2

MoveNext() è un metodo che viene chiamato più volte e ogni volta che deve passare all'elemento successivo. Ciò significa che non è possibile implementarlo semplicemente utilizzando un ciclo for (a meno che non si utilizzi yield return , che è praticamente la ragione per cui yield return esiste), è necessario riscriverlo in modo che ogni chiamata MoveNext() venga eseguita solo una parte di quel ciclo.

In particolare, sarebbe simile a questo:

class Enumerator : IEnumerator<int>
{
    private int i = -1;
    private ImplementList list;

    public Enumerator(ImplementList list)
    {
        this.list = list;
    }

    public bool MoveNext()
    {
        i++;
        return i < list.myList.Count;
    }

    public int Current { get { return list.myList[i]; } }

    object IEnumerator.Current { get { return Current; } }

    public void Dispose() {}

    public void Reset() { throw new NotSupportedException(); }
}

In questo modo, ogni chiamata a MoveNext() esegue le parti i++ e i < list.Count del ciclo for .

    
risposta data 21.07.2014 - 21:34
fonte

Leggi altre domande sui tag