如何在第一个枚举器中激活另一个枚举器

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 谢谢,会更正;我以为它是 IEnumerable Concat()IEnumerators 上不起作用,因此替代解决方案不起作用。 @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中引用另一个类的枚举?

在 SSIS 中,如何在 Foreach NodeList 枚举器中使用 XPATH 循环遍历特定元素内的 XML

可以创建枚举作为另一个枚举的一部分吗?