我正在尝试获得与示例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);
答案 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以上的结果。