如何处理"无限" IEnumerable的? [英] How to handle an "infinite" IEnumerable?

查看:168
本文介绍了如何处理"无限" IEnumerable的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是无限的IEnumerable的一个简单的例子是

A trivial example of an "infinite" IEnumerable would be

IEnumerable<int> Numbers() {
  int i=0;
  while(true) {
    yield return unchecked(i++);
  }
}



我知道,

I know, that

foreach(int i in Numbers().Take(10)) {
  Console.WriteLine(i);
}

var q = Numbers();
foreach(int i in q.Take(10)) {
  Console.WriteLine(i);
}



都工作得不错(并打印出号0-9)。

both work fine (and print out the number 0-9).

但是否有任何缺陷或复制像处理①?我可以依靠的事实,他们总是评为懒惰?是否有任何危险,产生无限循环?

But are there any pitfalls when copying or handling expressions like q? Can I rely on the fact, that they are always evaluated "lazy"? Is there any danger to produce an infinite loop?

推荐答案

是的,你是保证上面的代码会被执行懒洋洋地。虽然它看起来(在你的代码)就像你永远循环下去,你的代码的真正的产生是这样的:

Yes, you are guaranteed that the code above will be executed lazily. While it looks (in your code) like you'd loop forever, your code actually produces something like this:

IEnumerable<int> Numbers()
{
    return new PrivateNumbersEnumerable();
}

private class PrivateNumbersEnumerable : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator() 
    { 
        return new PrivateNumbersEnumerator(); 
    }
}

private class PrivateNumbersEnumerator : IEnumerator<int>
{
    private int i;

    public bool MoveNext() { i++; return true; }   

    public int Current
    {
        get { return i; }
    }
}



(这显然不是的究竟的究竟会产生,因为这是非常具体的,以你的代码,但它仍然相似,应该告诉你为什么它会是懒洋洋地评估)。

(This obviously isn't exactly what will be generated, since this is pretty specific to your code, but it's nonetheless similar and should show you why it's going to be lazily evaluated).

这篇关于如何处理&QUOT;无限&QUOT; IEnumerable的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆