Cuando uso la interfaz IEnumerable<T>
veo dos métodos GetEnumerator
: uno que devuelve IEnumerator
y otro IEnumerator<T>
. ¿Cuándo usaría uno u otro?IEnumerable <T> proporciona dos métodos de GetEnumerator: ¿cuál es la diferencia entre ellos?
Respuesta
Si implementa la interfaz genérica IEnumerable<T>
, tendrá más o menos siempre tiene que utilizar el método GetEnumerator genérico - a menos que emite su objeto explícitamente (no genérico) IEnumerable.
El motivo es la compatibilidad con .NET 1.0/1.1 al revés, que no admitía los genéricos.
El uno es genérico, el otro no. Creo que el compilador prefiere usar la sobrecarga genérica.
Normalmente GetEnumerator()
llama a GetEnumerator<T>()
, por lo que no debería haber mucha diferencia en el comportamiento. En cuanto a por qué hay dos métodos, esto se hace por compatibilidad con versiones anteriores y para su uso en situaciones donde T
no es de gran interés (o simplemente es desconocido).
La razón hay dos métodos se debe a IEnumerable<T>
hereda la interfaz IEnumerable
por lo que está viendo el método genérico de IEnumerable<T>
y el método no genérico de IEnumerable
.
Aquí es cómo desea implementar la interfaz en su tipo:
class Foo : IEnumerable<Foo>
{
public IEnumerator<Foo> GetEnumerator()
{
// do your thing here
}
// do a EIMI here and simply call the generic method
IEnumerator IEnumerable.GetEnumerator()
{
this.GetEnumerator();
}
}
Por lo general, implementar ambos. Una es la versión más nueva y genérica que devuelve un enumerador seguro (IEnumerator<T>
). El otro es por compatibilidad con el código heredado (devuelve IEnumerator
). Una aplicación típica es:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
¡esta me ayudó mucho, evitando la clase extra para el enumerador anidado! –
+1. También busqué en Google para encontrar una implementación de referencia que evita la clase de enumerador anidado y esta fue la primera respuesta que encontré. –
- 1. Diferencia entre IEnumerable e IEnumerable <T>?
- 2. IEnumerable.GetEnumerator() y IEnumerable <T> .GetEnumerator()
- 3. ¿Cuál es la diferencia entre List <string> e IEnumerable <String>?
- 4. ¿Cuál es la diferencia entre el IEnumerable no genérico y el IEnumerable genérico <T>?
- 5. ¿Por qué la implementación de 'IList <T>' requiere la definición de dos métodos 'GetEnumerator'?
- 6. ¿Hay alguna diferencia entre los métodos del iterador que devuelven IEnumerable <T> y IEnumerator <T>?
- 7. ¿Cuál es la diferencia entre esos dos?
- 8. Cuál es la diferencia entre IQueryable e IEnumerable
- 9. ¿Cuál es la diferencia entre IEnumerator e IEnumerable?
- 10. ¿Cuál es la diferencia entre IEnumerable y matrices?
- 11. Java: ¿Cuál es la diferencia entre estos métodos de construcción
- 12. ¿Cuál es la diferencia entre <%# %> y <%= %>?
- 13. ¿Cuál es la diferencia entre ofstream "<<" y Write
- 14. ¿Cuál es la diferencia entre <% %> y <%=%>?
- 15. En ASP.Net, ¿cuál es la diferencia entre <% = y <% #
- 16. ¿Cuál es la diferencia entre `=` y `<-` en R?
- 17. ¿Cuál es la diferencia entre estas dos declaraciones?
- 18. ¿Cuál es la diferencia entre System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator?
- 19. Cómo implementar IEnumerable <T> con GetEnumerator()?
- 20. ¿Cuál es la diferencia entre los dos métodos de decoración de vistas basadas en clases?
- 21. Cuál es la diferencia entre async.waterfall y async.series
- 22. ¿Cuál es la diferencia entre los métodos iterator y view?
- 23. ¿Cuál es la diferencia entre estos dos ejemplos de código?
- 24. ¿Cuál es la diferencia entre estos dos fragmentos de Perl?
- 25. ¿Cuál es la diferencia entre estas dos declaraciones de matriz?
- 26. Cuál es la diferencia entre estos dos patrones de JavaScript
- 27. ¿Ángulo entre dos vectores 2d, diferencia entre dos métodos?
- 28. Cuál es la diferencia entre mysqlimport y mysql <dbfile.sql
- 29. ¿Cuál es la diferencia entre "<>" y "! ="?
- 30. cuál es la diferencia entre '! =' Y '<>' en MySQL
+1 - EIMI = Implementación explícita del miembro de la interfaz –
Pero, ¿cómo demonios 'Foo: IEnumerable' tiene sentido? –
nawfal