如何在第一个枚举器中激活另一个枚举器
Posted
技术标签:
【中文标题】如何在第一个枚举器中激活另一个枚举器【英文标题】:How do I activate another Enumerator inside the first one 【发布时间】:2012-07-17 09:48:55 【问题描述】:我有两个单独的操作是枚举器。
一个可以独立运行,另一个依赖第一个在后面运行。
虽然我这样做会很聪明:
public IEnumerator<IResult> DoStuffIndependently()
yield return this;
yield return that;
public IEnumerator<IResult> DoStuffBeforeSometimes()
yield return AffectThis;
yield return AffectThat;
yield return DoStuffIndependently();
这不起作用,通过 foreach 也不起作用。我不想自己一步一步完成所有事情,我猜有一种非常简单的方法可以做到这一点。
【问题讨论】:
为什么通过 foreach 不起作用?IEnumerator
而不是IEnumerable
有什么具体原因吗?
你真的会产生“this”还是可以用“foobar”替换“this”?
@DanPuzey 不包含“GetEnumerator”的公共定义
@vidstige 是的,我写的时候没有把它当成关键字。
【参考方案1】:
方法要么是迭代器块(yield return
等),xor 是常规方法(return
等)。不能两者兼而有之。因此,要使用另一个迭代器,您必须对其进行迭代 - 即
yield return AffectThis;
yield return AffectThat;
using(var iter = DoStuffIndependently())
while(iter.MoveNext()) yield return iter.Current;
或者,您也许可以使用Concat
将两个现有迭代器拼接在一起。
【讨论】:
@BrankoDimitrijevic 谢谢,会更正;我以为它是 IEnumerableConcat()
在IEnumerator
s 上不起作用,因此替代解决方案不起作用。
@svick 如果一个人做了很多工作特别是使用 ienumerator(而不是 ienumerable),那么添加一个 Concat 将相当简单迭代器的扩展方法。【参考方案2】:
如果您希望它是 IEnumerator 而不是 IEnumerable,则必须手动遍历它:
public IEnumerator<IResult> DoStuffIndependently()
yield return this;
yield return that;
public IEnumerator<IResult> DoStuffBeforeSometimes()
yield return AffectThis;
yield return AffectThat;
var dsi = DoStuffIndependently();
while (dsi.MoveNext()) yield return dsi.Current;
【讨论】:
迂腐点:您应该始终检查以处置迭代器。幸运的是,通用版本很容易做到这一点,因为IDisposable
是有保证的。【参考方案3】:
使用IEnumerable
代替IEnumerator
并且foreach
应该可以正常工作:
public IEnumerable<IResult> DoStuffIndependently()
yield return This;
yield return That;
public IEnumerable<IResult> DoStuffBeforeSometimes()
yield return AffectThis;
yield return AffectThat;
foreach (var x in DoStuffIndependently())
yield return x;
或者,显式调用IEnumerator.MoveNext,如Marc suggested。
【讨论】:
以上是关于如何在第一个枚举器中激活另一个枚举器的主要内容,如果未能解决你的问题,请参考以下文章
枚举类型的 UserControl 属性在设计器中显示为 bool 或根本不显示
如何在ObjectDataProvider中引用另一个类的枚举?