产出继续?

12

编辑说明:这是一个基于对yield return工作原理误解的错误问题。简短回答:如果你不想yield return任何东西,那就不要yield return


使用yield return可以返回集合中的下一个元素,而使用yield break可以结束迭代。是否有类似的yield continue语句,可以告诉循环控制器跳到下一个元素?

我想实现以下代码,但显然无法构建:

static IEnumerable<int> YieldTest()
{
    yield return 1;
    yield return 2;
    yield continue;
    yield return 4;
}

3
请添加一些代码以澄清您要实现的目标。 - René Vogt
5
yield continue 后你期望会发生什么?调用者会收到什么?为什么不直接在 2 后使用 yield return 4; - BartoszKP
1
@BartoszKP 那只是一个例子。我也尝试在我的方法中使用 continue,但它无法构建,因为它不是有效的。 - oscilatingcretin
5
@oscilatingcretin 我知道这只是一个例子。我想问的是你希望这个例子如何运作。不清楚你需要它做什么。通常我会写yield return 1yield return 2yield return 4。客户端将收到三个整数,即1、2、4。你希望在2和4之间的客户端端发生什么? - BartoszKP
1
@oscilatingcretin continue 只能在循环中使用。 - Ondrej Tucny
我很难想象一个2k+用户在这方面遇到的问题。你希望 foreach (int i in YieldTest()) Print(i) 打印出 1 2 4 吗?但只需省略第三行就行了。_太困惑了_。 - Wolfzoon
2个回答

34

没有必要使用单独的 yield continue 语句。只需在枚举算法中使用 continue 或其他条件语句按需要跳过元素即可。

使用 yield 的枚举算法会被编译器内部转换为状态机,可以被多次调用。 yield 的作用是生成输出,有效地暂停/停止状态机在其使用处。可能的 yield continue 没有任何对状态机行为的影响。因此不需要它。

示例:

static IEnumerable<int> YieldTest()
{
    for (int value = 1; value <= 4; value++)
    {
        if (value == 3) continue;  // alternatively use if (value != 3) { … }
        yield return value;
    }
}

1
@Downvoter,请随意评论我的答案有什么问题,以便改进。 - Ondrej Tucny

1
如果您想向调用者传递有关数据中漏洞的信息,则使用可空性:
static IEnumerable<int?> YieldTest()
{
    yield return 1;
    yield return 2;
    yield return null;
    yield return 4;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接