Hi我遇到了一些方法的问题,该方法应该对一些IEnumerator对象实例执行操作,代码示例显示了这种情况:
class Program
{
static void Main(string[] args)
{
string[] testArray = { "Item1", "Item2" };
var query = testArray.Select((item, index) => new { index, item });
Console.WriteLine("Query run 1, {0}", Environment.NewLine);
foreach (var obj in query)
{
Console.WriteLine("{0}", obj);
}
Console.WriteLine("Query run 2, {0}", Environment.NewLine);
doAction<object>(query as IEnumerator<object>, obj => Console.WriteLine(obj) );
Console.WriteLine("Query run 3 ( same as run 1), {0}", Environment.NewLine);
foreach (var obj in query)
{
Console.WriteLine("{0}", obj);
}
Object tmp = Console.ReadLine();
}
private static void doAction<T>(IEnumerator<T> enumerator, Action<T> action)
{
if (enumerator == null)
{
throw new ArgumentNullException("enumerator");
}
if (action == null)
{
throw new ArgumentNullException("action");
}
while (enumerator.MoveNext())
{
action(enumerator.Current);
}
}
}
输出:
Query run 1,
{ index = 0, item = Item1 }
{ index = 1, item = Item2 }
Query run2,
Query run 3 ( same as run 1),
{ index = 0, item = Item1 }
{ index = 1, item = Item2 }
有人知道doAction
不采取行动的方法是什么吗?
真正的问题是,我需要用英语回答,因为我的情况真的很糟糕,我无法解释为什么会发生在我的伴侣身上。
提前谢谢。
Thnaks。
是-您不应该直接使用IEnumerator<T>
,而应该只使用IEnumerable<T>
。基本上,您会看到C#编译器实现迭代器块的奇怪方式:有一种类型同时实现IEnumerable<T>
和IEnumerator<T>
。这本身就很不寻常,但这是出于性能原因。这不是你应该利用或依赖的东西
从根本上说,将IEnumerable<T>
转换为IEnumerator<T>
是个坏主意-你不应该这样做。它们是不同的接口,代表着微妙的不同想法-"一个可以迭代的序列"one_answers"在序列上迭代的东西"之间的区别。
如果真的想使用IEnumerator<T>
作为doAction
(通常是DoAction
,btw)的参数类型,只需调用GetEnumerator()
即可:
using (var iterator = query.GetEnumerator())
{
doAction<object>(iterator, obj => Console.WriteLine(obj) );
}