我有以下功能来获取卡的验证错误。我的问题与处理 GetErrors 有关。两种方法具有相同的返回类型IEnumerable<ErrorInfo>。
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而不必枚举它们?
GetMoreErrors
这是 F# 支持yield!整个集合yield而不是单个项目的东西。(这在尾递归方面非常有用......)
yield!
yield
不幸的是,它在 C# 中不受支持。
但是,如果您有多个方法,每个方法都返回一个IEnumerable<ErrorInfo>,您可以使用它Enumerable.Concat来简化您的代码:
Enumerable.Concat
private static IEnumerable<ErrorInfo> GetErrors(Card card) { return GetMoreErrors(card).Concat(GetOtherErrors()) .Concat(GetValidationErrors()) .Concat(AnyMoreErrors()) .Concat(ICantBelieveHowManyErrorsYouHave()); }
不过,这两种实现之间有一个非常重要的区别:这个实现会 立即 调用所有方法,即使它一次只使用一个返回的迭代器。您现有的代码将等到它遍历完所有内容,GetMoreErrors()然后才会 询问 下一个错误。
GetMoreErrors()
通常这并不重要,但值得了解什么时候会发生什么。