Bor*_*ens 36 c# iterator yield
在我不断追求吸吮的过程中,我试图理解"收益"陈述,但我一直遇到同样的错误.
[someMethod]的主体不能是迭代器块,因为'System.Collections.Generic.List <AClass>'不是迭代器接口类型.
这是我遇到的代码:
foreach (XElement header in headersXml.Root.Elements()){
yield return (ParseHeader(header));
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我不能在迭代器中使用yield吗?那有什么意义呢?在这个例子中,它说它List<ProductMixHeader>不是迭代器接口类型.
ProductMixHeader是一个自定义类,但我想List是一个迭代器接口类型,不是吗?
- 编辑 -
感谢所有快速解答.
我知道这个问题不是全新的,同样的资源不断涌现.
事实证明我认为我可以List<AClass>作为返回类型返回,但由于List<T>不是懒惰,它不能.更改我的返回类型以IEnumerable<T>解决问题:D
一个有点相关的问题(不值得打开一个新线程):IEnumerable<T>如果我确定99%的情况我将要去.ToList(),它是否值得作为返回类型给出?性能影响是什么?
ang*_*son 32
使用yield return的方法必须声明为返回以下两个接口之一:
IEnumerable<SomethingAppropriate>
IEnumerator<SomethingApropriate>
Run Code Online (Sandbox Code Playgroud)
例:
public IEnumerable<AClass> YourMethod()
{
foreach (XElement header in headersXml.Root.Elements())
{
yield return (ParseHeader(header));
}
}
Run Code Online (Sandbox Code Playgroud)
yield是一个懒惰的数据生成器,只在检索到第一个后生成另一个项目,而返回一个列表将一次性返回所有内容.
所以有区别,你需要正确地声明方法.
有关更多信息,请阅读Jon的答案,其中包含一些非常有用的链接.
Jon*_*eet 15
这是一个棘手的话题.简而言之,它是实现IEnumerable及其朋友的简单方法.编译器为您构建状态机,将参数和局部变量转换为新类中的实例变量.复杂的东西.
我有一些资源:
"yield"创建一个迭代器块 - 一个编译器生成的类,可以实现IEnumerable[<T>]或者IEnumerator[<T>].Jon Skeet 在深度C#的第6章中对此进行了非常好的(并且免费的)讨论.
但基本上 - 使用"yield"你的方法必须返回一个IEnumerable[<T>]或IEnumerator[<T>].在这种情况下:
public IEnumerable<AClass> SomeMethod() {
// ...
foreach (XElement header in headersXml.Root.Elements()){
yield return (ParseHeader(header));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9361 次 |
| 最近记录: |