我有以下函数来获取卡的验证错误。我的问题与处理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
中的所有错误,而不必枚举它们?
发布于 2014-04-07 20:27:32
您可以像这样设置所有的错误源(方法名称借用自Jon Skeet的答案)。
private static IEnumerable<IEnumerable<ErrorInfo>> GetErrorSources(Card card)
{
yield return GetMoreErrors(card);
yield return GetOtherErrors();
yield return GetValidationErrors();
yield return AnyMoreErrors();
yield return ICantBelieveHowManyErrorsYouHave();
}
然后,您可以同时迭代它们。
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
foreach (var errorSource in GetErrorSources(card))
foreach (var error in errorSource)
yield return error;
}
或者,您可以使用SelectMany
扁平化错误源。
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
return GetErrorSources(card).SelectMany(e => e);
}
GetErrorSources
中的方法的执行也将被延迟。
发布于 2015-06-15 02:16:18
我想出了一个快速的yield_
片段:
下面是XML代码片段:
<?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>
发布于 2009-08-13 05:00:21
我看不出你的函数有什么问题,我会说它是在做你想做的事情。
可以认为,每次调用都会返回最后一个枚举中的一个元素,所以当您将它放在foreach循环中时,每次调用它都会返回一个元素。您可以在foreach中放置条件语句来过滤结果集。(简单地说就是不在排除标准上让步)
如果稍后在方法中添加后续的收益,它将继续向枚举添加1个元素,从而可以执行以下操作:
public IEnumerable<string> ConcatLists(params IEnumerable<string>[] lists)
{
foreach (IEnumerable<string> list in lists)
{
foreach (string s in list)
{
yield return s;
}
}
}
https://stackoverflow.com/questions/1270024
复制相似问题