Когда я реализую интерфейс IEnumerable<T>
, я вижу два метода: IEnumerator
и другие IEnumerator<T>
. Когда я буду использовать то или другое?IEnumerable <T> предоставляет два метода GetEnumerator - в чем разница между ними?
ответ
Если вы реализуете общий интерфейс IEnumerable<T>
, вы почти всегда придется использовать общий метод GetEnumerator - если вы не отбрасывают свой объект явно (необщего) IEnumerable.
Причина заключается в обратной совместимости с .NET 1.0/1.1, которая не поддерживает дженерики.
Один общий, другой нет. Я считаю, что компилятор предпочитает использовать общую перегрузку.
Обычно GetEnumerator()
вызывает GetEnumerator<T>()
, поэтому не должно быть большой разницы в поведении. Что касается того, почему существуют два метода, это делается для обратной совместимости и для использования в ситуации, когда T
не представляет большой интерес (или просто неизвестен).
Причины есть два метода, потому что IEnumerable<T>
наследует интерфейс IEnumerable
так что вы видите общий метод от IEnumerable<T>
и необщего метода из IEnumerable
.
Вот как вы хотите реализовать интерфейс в вашем типе:
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();
}
}
Вы обычно реализовать оба. Одна из них - это новая, универсальная версия, которая возвращает типбезопасный перечислитель (IEnumerator<T>
). Другой - для совместимости с кодом Legacy (возвращает IEnumerator
). Типичная реализация:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
это помогло мне, избегая лишнего класса для вложенного перечислителя! –
+1. Я также искал поисковые запросы, чтобы найти ссылочную реализацию, которая позволяет избежать вложенного класса перечислителя, и это был первый ответ, к которому я пришел. –
- 1. В чем разница между ними?
- 2. IEnumerable.GetEnumerator() и IEnumerable <T> .GetEnumerator()
- 3. В чем разница между ними не null и <> ''
- 4. В чем разница между ними для петель?
- 5. В чем разница между ними? (Голец)
- 6. В чем разница между IEnumerable и массивами?
- 7. В чем разница между IQueryable и IEnumerable
- 8. В чем разница между IEnumerator и IEnumerable?
- 9. В чем разница между IEnumerable и ObservableCollection?
- 10. IEnumerable <T> GetEnumerator() exexcution
- 11. В чем разница между << и + =?
- 12. В doxygen, в чем разница между /// <& ///?
- 13. Зачем нужен IEnumerator <T> GetEnumerator() и GetEnumerator()?
- 14. В чем разница между async.waterfall и async.series
- 15. В чем разница между =, <-, <= In haskell?
- 16. Какая разница между ними?
- 17. В чем разница между <%=%> и <%#%>
- 18. Метод «GetEnumerator» в тип прокси <IEnumerable> не реализация
- 19. В чем разница между двумя определениями метода?
- 20. В чем разница между списком <string> и IEnumerable <String>?
- 21. В чем разница между списком Cast <object> и Cast IEnumerable <object>
- 22. В чем разница между warden.authenticate? и user.valid_password?
- 23. В чем разница между <и << в C?
- 24. В чем разница между '<>' и '! ='
- 25. В чем разница между «<>» и «! =»?
- 26. разница между IEnumerable и словарем C#
- 27. Что такое OLTP и OLAP. В чем разница между ними?
- 28. В чем разница между ними? & Что я должен использовать?
- 29. r, ggplot2, форма/цвет. В чем разница между ними?
- 30. \ r \ n, \ r, \ n в чем разница между ними?
+1 - EIMI = Явная реализация элемента интерфейса –
Но как на земле 'Foo: IEnumerable' имеет смысл? –
nawfal