Quando si implementa l'interfaccia IEnumerable<T>
, vedo due metodi GetEnumerator
: uno che restituisce IEnumerator
e altri IEnumerator<T>
. Quando dovrei usare l'uno o l'altro?IEnumerable <T> fornisce due metodi GetEnumerator: qual è la differenza tra loro?
risposta
Se si implementa l'interfaccia generica IEnumerable<T>
, si quasi sempre necessario utilizzare il metodo GetEnumerator generica - a meno che non si lanci l'oggetto esplicitamente (non generica) IEnumerable.
Il motivo è la retrocompatibilità con .NET 1.0/1.1 che non supportava i generici.
L'uno è generico, l'altro no. Credo che il compilatore preferisca usare il sovraccarico generico.
Di solito GetEnumerator()
chiamate GetEnumerator<T>()
, quindi non ci dovrebbero essere molte differenze di comportamento. Per quanto riguarda il motivo per cui ci sono due metodi, questo è fatto per la retrocompatibilità e per l'uso in situazioni in cui T
non è di grande interesse (o è solo sconosciuto).
La ragione per cui ci sono due metodi è perché IEnumerable<T>
eredita l'interfaccia IEnumerable
in modo che si sta vedendo il metodo generico dal IEnumerable<T>
e il metodo non generico da IEnumerable
.
Ecco come si desidera implementare l'interfaccia nel vostro 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();
}
}
Di solito implementare entrambi. Uno è la versione più recente e generica che restituisce un enumeratore typesable (IEnumerator<T>
). L'altro è compatibile con il codice Legacy (restituisce IEnumerator
). Una tipica applicazione è:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
questo mi ha aiutato molto, evitando la classe extra per l'enumeratore annidato! –
+1. Ho anche cercato su google per trovare un'implementazione di riferimento che evitasse la classe di enumeratore annidata e questa è stata la prima risposta a cui sono arrivato. –
- 1. Differenza tra IEnumerable e IEnumerable <T>?
- 2. qual è la differenza tra questi due metodi?
- 3. Qual è la differenza tra l'elenco <string> e IEnumerable <String>?
- 4. Qual è la differenza tra questi due?
- 5. Qual è la differenza tra IEnumerator e IEnumerable?
- 6. Perché l'implementazione di "IList <T>" richiede la definizione di due metodi "GetEnumerator"?
- 7. In ASP.Net, qual è la differenza tra <% = e <% #
- 8. Qual è la differenza tra questi metodi di inizializzazione?
- 9. Java: Qual è la differenza tra questi metodi di costruzione
- 10. Quando utilizzare IEnumerable e GetEnumerator?
- 11. Qual è la differenza tra <stdio.h> e "stdio.h"?
- 12. Qual è la differenza tra `=` e `<-` in R?
- 13. Qual è la differenza tra questi metodi di namespace?
- 14. Qual è la differenza tra i metodi Html.Partial e Html.Action?
- 15. Come implementare IEnumerable <T> con GetEnumerator()?
- 16. Qual è la differenza tra Metodi e Attributi in Ruby?
- 17. Qual è la differenza tra metodi dinamici e virtuali?
- 18. Qual è la differenza tra questi metodi attendibili?
- 19. Qual è la differenza tra metodi e statica in Mongoose?
- 20. Qual è la differenza tra i metodi iteratore e vista?
- 21. Qual è la differenza tra i metodi di disegno KineticJS?
- 22. Qual è la differenza tra i due metodi di decorazione delle viste basate su classi?
- 23. Qual è la differenza tra async.waterfall e async.series
- 24. Perché la raccolta Controls non fornisce tutti i metodi IEnumerable?
- 25. Qual è la differenza tra mysqlimport e mysql <dbfile.sql
- 26. Qual è la differenza tra "<>" e "! ="?
- 27. Qual è la differenza tra dict() e {}?
- 28. Qual è la differenza tra queste due iterazioni di array?
- 29. Qual è la differenza tra queste due affermazioni
- 30. Qual è la differenza tra queste due funzioni/approcci?
+1 - EIMI = Implementazione esplicita membro interfaccia –
Ma come mai "Foo: IEnumerable" ha senso? –
nawfal