Domanda

Esistono classi IEnumerable non ripetibili?

Per non ripetibile intendo dove non è possibile chiamare GetEnumerator in modo sicuro più volte o dove chiamare GetEnumerator ha effetti collaterali osservabili.

È stato utile?

Soluzione

File.ReadLines() restituisce un IEnumerable<T> che funziona solo una volta.

Altri suggerimenti

È possibile che le implementazioni di IEnumerable (Of T) restituiscano qualsiasi articolo ritengano opportuno, per qualunque motivo. È abbastanza prevedibile che se si chiama GetEnumerator due volte sulla stessa sequenza di elementi e si procede quindi a scorrere entrambi gli enumeratori, essi dovrebbero produrre gli stessi elementi nello stesso ordine o generare un'eccezione. Esistono un certo numero di routine che accettano un IEnumerable (Of T) e falliranno male se ne viene dato uno che non rispetta tale contratto.

Se avessi i miei druther, IEnumerable sarebbe stato diviso in una famiglia di interfacce; l'enumeratore di base di IEnumerable perderebbe il metodo Reset e non darebbe particolari promesse di ripetibilità. Un nuovo IMultiEnumerable restituirebbe un enumeratore con un metodo di reset e una garanzia che più passaggi restituirebbero dati identici; l'enumeratore potrebbe anche supportare il proprio metodo GetEnumerator (penso che dovrebbe essere pratico per qualsiasi tipo in grado di supportare l'enumerazione multi-pass; l'unico costo sarebbe un puntatore "start" in modo che l'enumeratore nidificato venga ripristinato nella posizione originale creazione).

No, qualsiasi classe ben educata che implementa IEnumerable consentirà enumerazioni ripetute.

Per enumerare raccolte che non sono ripetibili, non hai una classe che implementa GetEnumerator. Invece hai un metodo che restituisce un enumeratore. In questo modo l'enumeratore invece di una classe detiene la raccolta, quindi non è possibile chiamare Enumerable.Range due volte per la stessa raccolta. Per ripetere l'enumeratore devi chiamare il metodo per creare una nuova raccolta.

Un esempio di questo è il metodo <=>. Crea gli elementi per un intervallo al volo, quindi l'intervallo non esiste come una raccolta, il che lo rende non ripetibile. Per enumerare nuovamente lo stesso intervallo, si chiama il metodo per creare un nuovo intervallo con gli stessi limiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top