使用SkipWhile

时间:2019-05-10 18:52:12

标签: c# loops

我正在尝试获得与示例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”中的示例:数字应大于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;

知道我在做什么错吗?

编辑

我找到了解决此问题的方法。通过将SkipWhile与TakeWhile结合使用,它可以工作。

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

1 个答案:

答案 0 :(得分:0)

问题是您用完了结果集。

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之后,您将为count得到0,乘以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),但是由于现在匹配谓词,因此它将返回 all 其余结果,甚至是1000以上的结果。