首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >立即返回所有可枚举项,并返回yield;不循环

立即返回所有可枚举项,并返回yield;不循环
EN

Stack Overflow用户
提问于 2009-08-13 04:26:41
回答 4查看 46.1K关注 0票数 186

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

代码语言:javascript
复制
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中的所有错误,而不必枚举它们?

EN

回答 4

Stack Overflow用户

发布于 2014-04-07 20:27:32

您可以像这样设置所有的错误源(方法名称借用自Jon Skeet的答案)。

代码语言:javascript
复制
private static IEnumerable<IEnumerable<ErrorInfo>> GetErrorSources(Card card)
{
    yield return GetMoreErrors(card);
    yield return GetOtherErrors();
    yield return GetValidationErrors();
    yield return AnyMoreErrors();
    yield return ICantBelieveHowManyErrorsYouHave();
}

然后,您可以同时迭代它们。

代码语言:javascript
复制
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    foreach (var errorSource in GetErrorSources(card))
        foreach (var error in errorSource)
            yield return error;
}

或者,您可以使用SelectMany扁平化错误源。

代码语言:javascript
复制
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    return GetErrorSources(card).SelectMany(e => e);
}

GetErrorSources中的方法的执行也将被延迟。

票数 32
EN

Stack Overflow用户

发布于 2015-06-15 02:16:18

我想出了一个快速的yield_片段:

下面是XML代码片段:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Author>John Gietzen</Author>
      <Description>yield! expansion for C#</Description>
      <Shortcut>yield_</Shortcut>
      <Title>Yield All</Title>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <Default>items</Default>
          <ID>items</ID>
        </Literal>
        <Literal Editable="true">
          <Default>i</Default>
          <ID>i</ID>
        </Literal>
      </Declarations>
      <Code Language="CSharp"><![CDATA[foreach (var $i$ in $items$) yield return $i$$end$;]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
票数 19
EN

Stack Overflow用户

发布于 2009-08-13 05:00:21

我看不出你的函数有什么问题,我会说它是在做你想做的事情。

可以认为,每次调用都会返回最后一个枚举中的一个元素,所以当您将它放在foreach循环中时,每次调用它都会返回一个元素。您可以在foreach中放置条件语句来过滤结果集。(简单地说就是不在排除标准上让步)

如果稍后在方法中添加后续的收益,它将继续向枚举添加1个元素,从而可以执行以下操作:

代码语言:javascript
复制
public IEnumerable<string> ConcatLists(params IEnumerable<string>[] lists)
{
  foreach (IEnumerable<string> list in lists)
  {
    foreach (string s in list)
    {
      yield return s;
    }
  }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1270024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档