我目前正在学习 F#,我真的很喜欢yield!
(yield-bang) 运算符。不仅因为它的名字,当然也因为它的作用。
该yield!
运算符基本上允许您从序列表达式中生成序列的所有元素。这对于组成枚举数很有用。因为我经常遇到大而复杂的枚举器,所以我对我们可以用来分解它们并从更简单的枚举器组合它们的策略感兴趣。
不幸的是,该yield!
运算符在 C# 中不可用。据我了解,它的作用类似于foreach (var x in source) yield x;
但我正在阅读的书(Petricek's Real World F# - Manning)表明它具有更好的性能......
- 那么 F# 编译器到底做了什么?(是的,我也可以使用 Reflector 来查看它,但我想对该机制进行更详细的描述)。
为了在 C# 中实现类似的构造,我探索了多种方法,但没有一种方法像yield!
运算符那样简洁,我也不确定它们的复杂性。如果我的 BigO 号码正确,有人可以提供输入吗?
将枚举器分解为多个私有枚举器,然后从公共枚举器中产生每个元素:
foreach (var x in part1()) yield x foreach (var x in part2()) yield x
这将有效地导致每个元素的“双倍产量”。那是O(2n)吗?(或者可能更糟?)无论如何,使用这种方法会阻止我使用我
yield break;
的任何子部分。将枚举器分解为多个私有枚举器,然后从公共枚举器中连接所有私有枚举器:
return part1().Concat(part2())
我相信这与上述解决方案没有什么不同,因为
Concat()
它是按照我上面概述的方式实现的。
还有其他选择吗?