收益率继续?

时间:2016-10-10 13:20:04

标签: c# loops ienumerable yield

OP编辑: 这是一个错误的问题,基于对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;
}

2 个答案:

答案 0 :(得分:18)

无需单独的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 :(得分:0)

如果您想将数据中的漏洞信息传递给调用者,请使用nullable:

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