我有以下函数来获取卡的验证错误。我的问题涉及处理 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
而不必枚举它们?
这是 F# 支持的东西yield!
对于整个集合 vsyield
对于单个项目。 (这对于尾递归来说非常有用......)
不幸的是,C# 不支持它。
但是,如果您有多个方法,每个方法都返回一个IEnumerable<ErrorInfo>
, 您可以使用Enumerable.Concat
使您的代码更简单:
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
return GetMoreErrors(card).Concat(GetOtherErrors())
.Concat(GetValidationErrors())
.Concat(AnyMoreErrors())
.Concat(ICantBelieveHowManyErrorsYouHave());
}
不过,这两种实现之间有一个非常重要的区别:这一个将调用所有方法立即地,即使它一次只使用一个返回的迭代器。您现有的代码将等待,直到它循环遍历完中的所有内容GetMoreErrors()
甚至在它之前asks关于接下来的错误。
通常这并不重要,但值得了解何时会发生什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)