c# - 什么时候真正需要 'Yield'?

标签 c# yield

<分区>

Possible Duplicate:
C# - Proper Use of yield return

C# yield 的实际用例是什么?

谢谢。

最佳答案

当你想要deferred execution .

这在大多数情况下都是有意义的,因为替代方案是构建一个临时集合。

考虑这个场景:我有一个整数列表,我想列出它们的平方数。

我可以这样做:

public static IEnumerable<int> Squares(this IEnumerable<int> numbers) {
    List<int> squares = new List<int>();
    foreach (int number in numbers)
        squares.Add(number * number);

    return squares;
}

然后我可以对平方求和,取它们的平均值,找到最大的,等等。

但我真的不需要填充一个全新的 List<int>为了这个目的。我本可以使用 yield枚举初始列表并逐个返回正方形:

public static IEnumerable<int> Squares(this IEnumerable<int> numbers) {
    foreach (int number in numbers)
        yield return number * number;
}

在您开始处理非常大的集合之前,这实际上会有所不同的事实可能并不明显,其中填充临时集合被证明是非常浪费的。

例如,假设我想找到高于特定阈值的第一个方 block 。我可以这样做:

IEnumerable<int> numbers = GetLotsOfNumbers();
var squares = numbers.Squares();
int firstBigSquare = squares
    .Where(x => x >= 1000)
    .FirstOrDefault();

但是如果我的Squares方法填充了整个 List<int>在返回之前,上述代码可能会做比必要的更多的工作。

关于c# - 什么时候真正需要 'Yield'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2990214/

相关文章:

c# - C# 中的 yield return 是线程安全的吗?

c# - 如何在 FakeHttpContext 中设置 Request.Header 以进行单元测试

c# - 隐藏所有打开的表单

c# - 访问系统图像列表

c# - 在 VSTO word 插件中调试 TrustNotGrantedException

c# - URL 编码 ASCII/UTF16 字符

c# - C# 中的 "yield"和 "yield return"有什么区别(如果有的话)?

Ruby: block 和产量

java - 如何从 API 端点按需使用数据库逐个获取的 yield 结果?是否需要网络套接字?