C # бесконечный цикл при использовании SkipWhile - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь достичь того же результата, что и в первом примере в примере B

Номера классов:

class Numbers: IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        int count = 1;
        while (true)
        {
            count *= 2;
            yield return count * 2;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Где пример в Main: Number должно быть больше 10 и меньше 1000

Numbers r = new Numbers();
var result = r.Where(i => i > 10 && i < 1000);
foreach (var VARIABLE in result)
{
    Console.WriteLine(VARIABLE);
}

Второй пример с SkipWhile (не работает)

var intset = r.SkipWhile(i => i < 10 || i > 1000);
foreach (var VARIABLE in intset)
{
    Console.WriteLine(VARIABLE);
}

Второй пример вызывает бесконечный цикл. Начинается с 16, но продолжает печатать 0;

Есть идеи, что я делаю не так?

EDIT

Я нашел решение этой проблемы. Комбинируя SkipWhile с TakeWhile, он работает.

var intset = r2.SkipWhile(i => i < 10).TakeWhile(z => z < 1000);

1 Ответ

0 голосов
/ 10 мая 2019

Проблема в том, что вы израсходовали набор результатов.

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.

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