当前位置:  开发笔记 > 编程语言 > 正文

一些有助于理解"产量"

如何解决《一些有助于理解"产量"》经验,为你挑选了3个好方法。

在我不断追求吸吮的过程中,我试图理解"收益"陈述,但我一直遇到同样的错误.

[someMethod]的主体不能是迭代器块,因为'System.Collections.Generic.List '不是迭代器接口类型.

这是我遇到的代码:

foreach (XElement header in headersXml.Root.Elements()){
    yield return (ParseHeader(header));                
}

我究竟做错了什么?我不能在迭代器中使用yield吗?那有什么意义呢?在这个例子中,它说它List不是迭代器接口类型. ProductMixHeader是一个自定义类,但我想List是一个迭代器接口类型,不是吗?

- 编辑 -
感谢所有快速解答.
我知道这个问题不是全新的,同样的资源不断涌现.
事实证明我认为我可以List作为返回类型返回,但由于List不是懒惰,它不能.更改我的返回类型以IEnumerable解决问题:D

一个有点相关的问题(不值得打开一个新线程):IEnumerable如果我确定99%的情况我将要去.ToList(),它是否值得作为返回类型给出?性能影响是什么?



1> angry person..:

使用yield return的方法必须声明为返回以下两个接口之一:

IEnumerable
IEnumerator

(感谢Jon和Marc指出IEnumerator)

例:

public IEnumerable YourMethod()
{
    foreach (XElement header in headersXml.Root.Elements())
    {
        yield return (ParseHeader(header));                
    }
}

yield是一个懒惰的数据生成器,只在检索到第一个后生成另一个项目,而返回一个列表将一次性返回所有内容.

所以有区别,你需要正确地声明方法.

有关更多信息,请阅读Jon的答案,其中包含一些非常有用的链接.


弄它,被打了7秒;)
对于记录:或IEnumerator []
它也可以声明为返回IEnumerator或IEnumerator .

2> Jon Skeet..:

这是一个棘手的话题.简而言之,它是实现IEnumerable及其朋友的简单方法.编译器为您构建状态机,将参数和局部变量转换为新类中的实例变量.复杂的东西.

我有一些资源:

深度C#的第6章(从该页面免费下载)

迭代器,迭代器块和数据管道(文章)

迭代器块实现细节(文章)



3> Marc Gravell..:

"yield"创建一个迭代器块 - 一个编译器生成的类,可以实现IEnumerable[]或者IEnumerator[].Jon Skeet 在深度C#的第6章中对此进行了非常好的(并且免费的)讨论.

但基本上 - 使用"yield"你的方法必须返回一个IEnumerable[]IEnumerator[].在这种情况下:

public IEnumerable SomeMethod() {
    // ...
    foreach (XElement header in headersXml.Root.Elements()){
        yield return (ParseHeader(header));                
    }
}

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有