Здравствуйте, Sinix, Вы писали:
S> Правда я вообще не представляю, как yield many может повлиять на производительность.
Вот так:
Попробуйте на нынешних итераторах что-нибудь сильно рекурсивное написать, тогда может даже невооружённым глазом заметна будет разница
Образно говоря, с yield return получается, что внутри итератора стек из специальных энумераторов, которые могут вернуть либо значение, либо энумератор (либо ещё хвостовой энумератор). Если на MoveNext() энумератор возвращает энумератор, то его запихивают в вершину стека и перебирают дальше его. По завершению перебора энумератор выбрасывается из вершины стека и перебор продолжается, если в стеке есть ещё энумераторы.
То есть если у Вас сейчас итератор вызвал сам себя (или другой итератор) 1000 раз, то чтобы получить очередное значение, надо добраться до энумератора, который вложен в 1000 экземпяров итераторов — MoveNext() и get_Current() будет вызваны 1000 раз... А у yield return-итератора нужный энумератор всегда лежит на вершине стека, один MoveNext() считай...
На графике у итератора квадратичная сложность, но я что-то не догоняю почему