gpt4 book ai didi

c# - 立即返回所有具有 yield return 的枚举;无需循环

转载 作者:IT王子 更新时间:2023-10-29 03:31:16 24 4
gpt4 key购买 nike

我有以下函数来获取卡片的验证错误。我的问题与处理 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!对于整个系列与 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() 中的所有内容。在它甚至询问下一个错误之前。

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

关于c# - 立即返回所有具有 yield return 的枚举;无需循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1270024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com