Каково требование к коллекции для того, чтобы на нее можно было вставить foreach? - PullRequest
4 голосов
/ 27 февраля 2012

Какое требование к коллекции для того, чтобы мы могли поместить ее в c #? Какие типы мы можем поставить для каждого?

РЕДАКТИРОВАТЬ 1: Может кто-нибудь придумать пример кода пользовательской коллекции, в которой реализован Foreach.

Ответы [ 3 ]

5 голосов
/ 27 февраля 2012

Реализует IEnumerable или IEnumerable<T>

Редактировать: есть складка, что если у типа есть метод с именем GetEnumerator (), который возвращает IEnumerator, то он также может использоваться в foreach. см http://brendan.enrick.com/post/Foreach-IEnumerable-IEnumerator-and-Duck-Typing.aspx

3 голосов
/ 27 февраля 2012

Единственным формальным требованием является то, что у него есть метод с именем GetEnumerator(), который возвращает что-то , которое имеет свойство SomeType Current {get;} и метод bool MoveNext(). Однако чаще всего это делается путем реализации интерфейса IEnumerable / IEnumerable<T>. Действительно, ожидается , что вы будете реализовывать этот интерфейс (более старый метод действительно был задуман как предварительная оптимизация), и использование интерфейса позволит потребителям использовать вашу коллекцию с такими вещами, как LINQ и collection- инициализаторы.

В интересных случаях самый простой способ реализовать это через "блок итератора". Например:

class Foo : IEnumerable<int> {
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }

    public IEnumerator<int> GetEnumerator() {
       yield return 16;
       yield return 12;
       yield return 31;
       // ^^ now imagine the above was a loop over some internal structure -
       // for example an array, list, linked-list, etc, with a "yield return"
       // per item
    }
}
3 голосов
/ 27 февраля 2012

Общепринято, что вам нужна реализация IEnumerable или IEnumerable<T>, но вы можете прочитать из поста Эрика Следуя шаблону , что это не так

Требуется, чтобы тип коллекции был общедоступным. метод с именем GetEnumerator, и он должен возвращать некоторый тип, который имеет метод получения открытого свойства с именем Current и открытый метод MoveNext который возвращает bool.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...