收益率很高?

mpe*_*pen 53 c#

我发现自己经常讨论IEnumerables,以便我可以返回每个结果.有没有办法压缩这样的东西

foreach (var subSelector in subSelectors)
{
    foreach (var node in FindSingle(context, subSelector))
        yield return node;
} 
Run Code Online (Sandbox Code Playgroud)

去除内在的foreach?

Eri*_*ert 64

这是C#不支持的频繁请求的功能.有关详细信息,请参阅此Connect项:

http://connect.microsoft.com/VisualStudio/feedback/details/256934/yield-return-to-also-yield-collections

建议的语法通常类似于:

public static IEnumerable<T> PreorderTraversal<T>(this BinaryTree<T> root)
{
    if (root == null) yield break;
    yield return root.Item;
    yield foreach root.Left.PreorderTraversal();
    yield foreach root.Right.PreorderTraversal();
}
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣使用支持此功能的C#语言,请查看Cω:

http://research.microsoft.com/en-us/um/cambridge/projects/comega/

您可能还想阅读Cω实现者关于该功能的这篇论文:

http://research.microsoft.com/en-us/projects/specsharp/iterators.pdf

如果您对支持此功能的非C#语言感兴趣,请查看"yield!" F#的特点.(我只是喜欢这个功能的名称是"收益!")

即使你对理论上的东西不感兴趣,听起来你把这种情况视为一个实际问题.你还应该阅读Wes Dyer关于有效地进行这种嵌套迭代的技术的文章,而不是"yield foreach":

http://blogs.msdn.com/b/wesdyer/archive/2007/03/23/all-about-iterators.aspx

  • 我认为只要"收益率"听起来会更好.谢谢你的回答!这是有趣的. (9认同)
  • @mpen你现在可以使用`yield`作为类名,并使用`each`作为变量名,因此可能会有包含单词`yield each`的代码.现在c#可以确定`yield return`中的`yield`是一个关键字,因为它后跟另一个关键字; 所以以类似的方式,"产量foreach"可能会更好. (3认同)
  • 或者“YieldMany”,它非常适合 SelectMany (2认同)
  • @StrategyThinker:的确,这是标准的提议语法; 请参阅Kiril 2007年的文章:http://kirillosenkov.blogspot.com/2007/10/yield-foreach.html (2认同)

SLa*_*aks 17

没有,没有,除非你完全代替每yield return有一个return使用LINQ语句.

例如:

return someSet
    .Concat(someOtherSet.SelectMany(s => FindSingle(context, s));
Run Code Online (Sandbox Code Playgroud)


小智 7

在 C# 7.0 中,允许使用本地函数,这使我们能够有一个相当简洁的方法

IEnumerable<T> FlatEnumerable(){
    IEnumerable<IEnumerable<T>> NestedEnumerable(){
       yield return myEnumerable1;
       yield return myEnumerable2;
    }

    return NestedEnumerable().SelectMany(e => e);
}
Run Code Online (Sandbox Code Playgroud)

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/local-functions

  • 我想知道投反对票的原因。这是简短且可维护的。 (3认同)
  • 数组不会完全相同,因为您将丢失最初可能是 MO 的延迟执行。 (2认同)

Mar*_*ers 6

使用Enumerable.SelectMany

return subSelectors.SelectMany(subselector => FindSingle(context, subSelector));
Run Code Online (Sandbox Code Playgroud)

仅当您的方法中没有任何其他yield return 语句时,这才有效。

  • 是的...但是在那之后你就不能再产生任何东西了。 (25认同)