我经常发现我使用语句返回一个 IEnumerable 的场景yield return
,然后有其他方法使用不同的参数调用这个函数并直接返回结果。
yield return
与简单地返回集合相比,遍历结束这些结果的结果是否有任何性能优势?即,如果我return
在生成的 IEnumberable 上使用而不是再次循环遍历这些结果并使用yield return
编译器是否知道仅在需要时生成结果,还是在返回所有结果之前等待返回整个集合?
public class Demo
{
private IEnumerable<int> GetNumbers(int x)
{
//imagine this operation were more expensive than this demo version
//e.g. calling a web service on each iteration.
for (int i = 0; i < x; i++)
{
yield return i;
}
}
//does this wait for the full list before returning
public IEnumerable<int> GetNumbersWrapped()
{
return GetNumbers(10);
}
//whilst this allows the benefits of Yield Return to persist?
public IEnumerable<int> GetNumbersWrappedYield()
{
foreach (int i in GetNumbers(10))
yield return i;
}
}