Linq结果出现问题



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) );
}

相关内容

  • 没有找到相关文章

最新更新