Pregunta

¿Hay clases IEnumerable no repetibles?

Por no repetible quiero decir donde no se puede llamar a GetEnumerator de forma segura varias veces o donde llamar a GetEnumerator tiene efectos secundarios observables.

¿Fue útil?

Solución

File.ReadLines() devuelve un IEnumerable<T> que solo funciona una vez.

Otros consejos

Es posible que las implementaciones de IEnumerable (Of T) devuelvan los elementos que consideren adecuados, por cualquier motivo. Es bastante esperado que si uno llama a GetEnumerator dos veces en la misma secuencia de elementos, y luego procede a recorrer los dos enumeradores, deberían producir los mismos elementos en el mismo orden o lanzar una excepción. Hay una serie de rutinas que aceptan un IEnumerable (Of T) y fallarán gravemente si se les da una que no cumpla con dicho contrato.

Si tuviera mis druthers, IEnumerable se habría dividido en una familia de interfaces; el enumerador básico de IEnumerable perdería el método Reset y no transmitiría ninguna promesa particular de repetibilidad. Un nuevo IMultiEnumerable devolvería un enumerador con un método Reset y una garantía de que varios pases producirían datos idénticos; el enumerador también podría admitir su propio método GetEnumerator (creo que debería ser práctico para cualquier tipo que pueda admitir la enumeración de pasadas múltiples; el único costo sería un puntero de 'inicio' para que el enumerador anidado se restablezca a la ubicación de su original creación).

No, cualquier clase de buen comportamiento que implemente IEnumerable permitirá enumeraciones repetidas.

Para enumerar colecciones que no son repetibles, no tiene una clase que implemente GetEnumerator. En su lugar, tiene un método que devuelve un enumerador. De esta forma, el enumerador en lugar de una clase retiene la colección, por lo que no es posible llamar a Enumerable.Range dos veces para la misma colección. Para repetir el enumerador, debe llamar al método para crear una nueva colección.

Un ejemplo de esto es el método <=>. Crea los elementos para un rango sobre la marcha, por lo que el rango no existe como una colección, lo que lo hace no repetible. Para enumerar el mismo rango nuevamente, llame al método para crear un nuevo rango con los mismos límites.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top