【发布时间】:2011-02-08 00:24:36
【问题描述】:
基本上我想知道是否可以在随后的代码中多次使用枚举。无论您是否提前中断,枚举是否会在以下每个 foreach 案例中始终重置,因此从效果集合的开始到结束为我们提供一致的枚举?
var effects = this.EffectsRecursive;
foreach (Effect effect in effects)
{
...
}
foreach (Effect effect in effects)
{
if(effect.Name = "Pixelate")
break;
}
foreach (Effect effect in effects)
{
...
}
编辑: EffectsRecursive 的实现是这样的:
public IEnumerable<Effect> Effects
{
get
{
for ( int i = 0; i < this.IEffect.NumberOfChildren; ++i )
{
IEffect effect = this.IEffect.GetChildEffect ( i );
if ( effect != null )
yield return new Effect ( effect );
}
}
}
public IEnumerable<Effect> EffectsRecursive
{
get
{
foreach ( Effect effect in this.Effects )
{
yield return effect;
foreach ( Effect seffect in effect.ChildrenRecursive )
yield return seffect;
}
}
}
【问题讨论】:
-
顺便说一句,我添加了 EffectsRecursive 的实现。
-
当心递归收益率。这里有很多编译器魔法在创建状态机。如果数据结构很大,这可能会比您预期的性能更低/更复杂。
-
@spender:谢谢,我可以使用其他方法吗?
-
@Eric 在下面的回答比我能做的更有说服力。
标签: c# .net ienumerable