【发布时间】:2011-03-31 04:00:28
【问题描述】:
我正要构建自己的 IEnumerable 类,该类在第一次迭代它时对所有项目执行一些操作,然后我开始想,框架是否已经有我可以使用的东西?
这是我正在构建的,所以你知道我在寻找什么:
public class DelayedExecutionIEnumerable<T> : IEnumerable<T>
{
IEnumerable<T> Items;
Action<T> Action;
bool ActionPerformed;
public DelayedExecutionIEnumerable(IEnumerable<T> items, Action<T> action)
{
this.Items = items;
this.Action = action;
}
void DoAction()
{
if (!ActionPerformed)
{
foreach (var i in Items)
{
Action(i);
}
ActionPerformed = true;
}
}
#region IEnumerable<IEntity> Members
public IEnumerator<T> GetEnumerator()
{
DoAction();
return Items.GetEnumerator();
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
DoAction();
return Items.GetEnumerator();
}
#endregion
}
【问题讨论】:
-
这样做的目的是什么?
-
我不知道框架中内置了任何内容,您的实现似乎可以满足您的需求。我唯一要提到的是,如果多个线程同时调用 GetEnumerator(),您的代码很容易遇到问题。
-
为什么要在返回之前循环遍历并执行所有操作?您可以在迭代时更轻松地执行操作和
yield return每个项目,因此只需要一次迭代并进一步推迟操作的执行。
标签: c# .net ienumerable deferred-execution delayed-execution