关于迭代器.

uniqueroy 2014-01-08 05:14:01
我实现了如下代码。

class Program
{
class GenEnumerator<T> : IEnumerable
{
public T[] Values { get; set; }


public IEnumerator GetEnumerator()
{
for (int i = 0; i < Values.Length; i++)
yield return Values[i];
}
}

static void Main(string[] args)
{
GenEnumerator<string> g = new GenEnumerator<string>();
g.Values = new string[] { "a", "b", "c", "d", "e" };
g.GetEnumerator().MoveNext();

Console.WriteLine(g.GetEnumerator().Current);


Console.ReadKey();
}
}



为什么current没有值呢?
但如果

var a = g.GetEnumerator();

这样就可以,为什么呢?
如果我继承IEnumerator接口,实现其方法和属性。可以吗?
...全文
154 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 10 楼 huanglin02 的回复:
引用 9 楼 Hsuifengershi 的回复:
引用 2 楼 huanglin02 的回复:
引用 1 楼 Hsuifengershi 的回复:
调试才是王道
废话。。。
过年了 没撒送你 就送你几个bug把 不够还可再送
参天啊。。。。
穷的就只有bug了
小律律 2014-01-09
  • 打赏
  • 举报
回复
引用 9 楼 Hsuifengershi 的回复:
引用 2 楼 huanglin02 的回复:
引用 1 楼 Hsuifengershi 的回复:
调试才是王道
废话。。。
过年了 没撒送你 就送你几个bug把 不够还可再送
参天啊。。。。
  • 打赏
  • 举报
回复
引用 2 楼 huanglin02 的回复:
引用 1 楼 Hsuifengershi 的回复:
调试才是王道
废话。。。
过年了 没撒送你 就送你几个bug把 不够还可再送
uniqueroy 2014-01-08
  • 打赏
  • 举报
回复
引用 7 楼 wyd1520 的回复:
[quote=引用 6 楼 uniqueroy 的回复:] [quote=引用 5 楼 wyd1520 的回复:]

 IEnumerator ie=list.GetEnumerator();
            while (ie.MoveNext())
            {
                Console.WriteLine(ie.Current);
            }
这样才有意义 因为你每次都是 g.GetEnumerator().MoveNext(); Console.WriteLine(g.GetEnumerator().Current); 这样会造成每次重新调g.GetEnumerator()这个方法 造成永远没有MoveNext 你要先定义一个变量 IEnumerator ie=list.GetEnumerator(); 然后ie.MoveNext();ie.Current就有值了。
明白了,也就是说g.GetEnumerator()返回的都是一个新的IEnumerator?即便我MoveNext了。是吗?[/quote] 是的。[/quote] 谢谢了。有点像对string的操作。
本拉灯 2014-01-08
  • 打赏
  • 举报
回复
引用 6 楼 uniqueroy 的回复:
[quote=引用 5 楼 wyd1520 的回复:]

 IEnumerator ie=list.GetEnumerator();
            while (ie.MoveNext())
            {
                Console.WriteLine(ie.Current);
            }
这样才有意义 因为你每次都是 g.GetEnumerator().MoveNext(); Console.WriteLine(g.GetEnumerator().Current); 这样会造成每次重新调g.GetEnumerator()这个方法 造成永远没有MoveNext 你要先定义一个变量 IEnumerator ie=list.GetEnumerator(); 然后ie.MoveNext();ie.Current就有值了。
明白了,也就是说g.GetEnumerator()返回的都是一个新的IEnumerator?即便我MoveNext了。是吗?[/quote] 是的。
uniqueroy 2014-01-08
  • 打赏
  • 举报
回复
引用 5 楼 wyd1520 的回复:

 IEnumerator ie=list.GetEnumerator();
            while (ie.MoveNext())
            {
                Console.WriteLine(ie.Current);
            }
这样才有意义 因为你每次都是 g.GetEnumerator().MoveNext(); Console.WriteLine(g.GetEnumerator().Current); 这样会造成每次重新调g.GetEnumerator()这个方法 造成永远没有MoveNext 你要先定义一个变量 IEnumerator ie=list.GetEnumerator(); 然后ie.MoveNext();ie.Current就有值了。
明白了,也就是说g.GetEnumerator()返回的都是一个新的IEnumerator?即便我MoveNext了。是吗?
本拉灯 2014-01-08
  • 打赏
  • 举报
回复

 IEnumerator ie=list.GetEnumerator();
            while (ie.MoveNext())
            {
                Console.WriteLine(ie.Current);
            }
这样才有意义 因为你每次都是 g.GetEnumerator().MoveNext(); Console.WriteLine(g.GetEnumerator().Current); 这样会造成每次重新调g.GetEnumerator()这个方法 造成永远没有MoveNext 你要先定义一个变量 IEnumerator ie=list.GetEnumerator(); 然后ie.MoveNext();ie.Current就有值了。
本拉灯 2014-01-08
  • 打赏
  • 举报
回复
引用 楼主 uniqueroy 的回复:
我实现了如下代码。

class Program
    {
        class GenEnumerator<T> : IEnumerable
        {
            public T[] Values { get; set; }


            public IEnumerator GetEnumerator()
            {
                for (int i = 0; i < Values.Length; i++)
                    yield return Values[i];
            }
        }

        static void Main(string[] args)
        {
            GenEnumerator<string> g = new GenEnumerator<string>();
            g.Values = new string[] { "a", "b", "c", "d", "e" };
            g.GetEnumerator().MoveNext();
            
            Console.WriteLine(g.GetEnumerator().Current);


            Console.ReadKey();
        }
    }
为什么current没有值呢? 但如果

            var a = g.GetEnumerator();
这样就可以,为什么呢? 如果我继承IEnumerator接口,实现其方法和属性。可以吗?
你弄混了吧 IEnumerator 跟IEnumerable 是不一样的哦 你上面的 current 那是因为你里面的GenEnumerator 集合没有项。然后你调用了g.GetEnumerator() 这个方法里面是迭代器,又返回值所以有值
uniqueroy 2014-01-08
  • 打赏
  • 举报
回复
引用 1 楼 Hsuifengershi 的回复:
调试才是王道
谢谢,我调试了,能不能再说的明白点?
小律律 2014-01-08
  • 打赏
  • 举报
回复
引用 1 楼 Hsuifengershi 的回复:
调试才是王道
废话。。。
  • 打赏
  • 举报
回复
调试才是王道

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧