Domanda

Sto abbandonando questa riga dopo aver visitato diversi siti Web per provare a comprendere l'esempio in tempo reale dell'utilizzo dell'enumerazione personalizzata. Ho degli esempi. Ma mi portano alla confusione.

Esempio

Prendi 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

    public NumberArray(int[] scores)
    {
        this.scores = scores;
    }

    public int[] Scores
    {
        get {return scores;}
    }

}

Prendi 2

public class Enumerator : IEnumerator
{
    int[] scores;
    int cur;
    public Enumerator(int[] scores)
    {
        this.scores = scores;
        cur = -1;
    }
    public Object Current
    {
        get {
            return scores[cur];
        }
    }

    public void Reset()
    {
        cur = -1;
    }

    public bool MoveNext()
    {
        cur++;
        if (cur < scores.Length)
            return true;
        else return false;
    }
}

public class Enumerable : IEnumerable
{
    int[] numbers;

    public void GetNumbersForEnumeration(int[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

principale

static void Main()
{
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
    NumberArray num = new NumberArray(arr);
    foreach(int val in num.Scores)
    {
        Console.WriteLine(val);
    }

    Enumerable en = new Enumerable();
    en.GetNumbersForEnumeration(arr);

    foreach (int i in en)
    {
        Console.WriteLine(i);
    }
    Console.ReadKey(true);
}

In Take 2, ho seguito l'iterazione personalizzata per iterare lo stesso array intero come ho fatto in take 1. Perché dovrei battere sulla boscaglia per iterare un numero intero usando l'iterazione personalizzata ?

Probabilmente ho perso la iterazione personalizzata in tempo reale . Potete spiegarmi il compito che non posso svolgere con la struttura di iterazione esistente? ( Ho appena finito la scuola, quindi dammi un semplice esempio, in modo che io possa capirlo correttamente ).

Aggiornamento: Ho preso quegli esempi da qualche sito. Non c'è nulla di speciale in quel codice, possiamo realizzarlo in modo molto semplice anche senza usare l'iterazione personalizzata, il mio interesse era conoscere il vero scenario in cui l'iterazione personalizzata è abbastanza utile.

È stato utile?

Soluzione

Gli iteratori personalizzati sono utili quando le risorse che stai iterando non sono precaricate in memoria, ma piuttosto ottenute secondo necessità in ogni iterazione. Ad esempio, in LINQ to SQL, quando fai qualcosa del tipo:

foreach(var employee in dataContext.Employees) {
    // Process employee
}

in ogni passaggio del ciclo foreach , viene richiesta la tabella Employees nel database per ottenere il record successivo. In questo modo, se esci dal ciclo in anticipo, non hai letto l'intera tabella, ma solo i record di cui avevi bisogno.

Vedi qui per un esempio reale: enumera le righe su un file . Qui, ogni riga viene letta dal file su ogni iterazione del ciclo foreach . (come nota a margine, .NET Framework 4 offre questa stessa funzionalità integrata).

Altri suggerimenti

Ad essere sincero, non sono del tutto sicuro di ciò che stai chiedendo, ma se sei preoccupato per la differenza tra la restituzione di un array (come nel take 1) e la restituzione di un iteratore (take 2), ecco la mia risposta .

Esiste una grande differenza tra la restituzione di un array e la restituzione di un iteratore. Restituire un array significa restituire lo stato interno (a meno che non si faccia una copia come parte del reso, ma è costoso). Se si restituisce un iteratore, si restituisce solo un'astrazione, che consente ai chiamanti di iterare lo stato. Questo significa anche che puoi fare una valutazione pigra se necessario (cosa che ovviamente non puoi fare se stai restituendo un array).

Inoltre, con il supporto per gli iteratori in C # 2, non c'è davvero alcun motivo per implementare IEnumerable a mano. Per ulteriori dettagli, consultare questa domanda Qualcuno può demistificare la parola chiave del rendimento?

Proprio come un altro esempio in cui l'iterazione personalizzata mi è stata utile in passato è stato quello di fornire un'astrazione comune per enumerare ricorsivamente tutti i nodi in una struttura ad albero ...

foreach (Node n in tree)
  //...do something
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top