小编典典

一次返回所有具有收益返回的枚举;不循环

all

我有以下功能来获取卡的验证错误。我的问题与处理 GetErrors 有关。两种方法具有相同的返回类型IEnumerable<ErrorInfo>

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    var errors = GetMoreErrors(card);
    foreach (var e in errors)
        yield return e;

    // further yield returns for more validation errors
}

是否可以返回所有错误GetMoreErrors而不必枚举它们?


阅读 71

收藏
2022-07-17

共1个答案

小编典典

这是 F# 支持yield!整个集合yield而不是单个项目的东西。(这在尾递归方面非常有用......)

不幸的是,它在 C# 中不受支持。

但是,如果您有多个方法,每个方法都返回一个IEnumerable<ErrorInfo>,您可以使用它Enumerable.Concat来简化您的代码:

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    return GetMoreErrors(card).Concat(GetOtherErrors())
                              .Concat(GetValidationErrors())
                              .Concat(AnyMoreErrors())
                              .Concat(ICantBelieveHowManyErrorsYouHave());
}

不过,这两种实现之间有一个非常重要的区别:这个实现会 立即
调用所有方法,即使它一次只使用一个返回的迭代器。您现有的代码将等到它遍历完所有内容,GetMoreErrors()然后才会 询问 下一个错误。

通常这并不重要,但值得了解什么时候会发生什么。

2022-07-17