Проблема в том, что вы израсходовали набор результатов.
class Numbers: IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
int count = 1;
while (true)
{
count *= 2;
yield return count * 2;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Когда вы умножаете count *= 2
, вы в конечном итоге превысите размер типа переменной int
, и, в конце концов, после возврата -2147483648 вы получите 0 для count
, умноженное на 2, всегда равно 0.
Так что теперь, когда вы используете его во втором примере, все, что он когда-либо вернет, будет 0.
Вот первый набор результатов:
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
-2147483648
0
0
0 ...
Так что либо вы должны каким-то образом сбросить Numbers
, либо справиться с переворачиванием.
Другая проблема, с которой вы столкнулись, заключается в том, как SkipWhile
работает:
Обходит элементы в последовательности, пока заданное условие выполняется, и затем возвращает оставшиеся элементы .
Таким образом, он пропустит все, что меньше 10 (следующее число - 16), но поскольку что-то теперь соответствует предикату, он вернет все оставшиеся результаты, даже те, которые выше 1000.