首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c#foreach、IEnumrator、yield的懂得

2014-01-14 
c#:foreach、IEnumrator、yield的理解using Systemusing System.Collections.Genericusing System.Textus

c#:foreach、IEnumrator、yield的理解

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace yield_learn
{
    public class person : System.Collections.IEnumerable
    {
        #region IEnumerable
        public string x = "cc";
        public System.Collections.IEnumerator GetEnumerator()
        {
            yield return "1";
            Thread.Sleep(3000);
            yield return "2";
            Thread.Sleep(3000);
            yield return "3";
            Thread.Sleep(3000);
            yield return "4";
            Thread.Sleep(3000);
            yield return "5";
            Thread.Sleep(3000);
            yield return "6";

        }//是如何选择遍历哪个的??
        public System.Collections.IEnumerator getnum()
        {
            yield return "dshdjs";//为什么没有输出这个??
        }
        #endregion
    }
    class Program
    {
        static void Main(string[] args)
        {
            person arrperson = new person();
            foreach (string s in arrperson)//遍历一个类中的string吗,必须带有System.Collections.IEnumerator的才遍历,但是为什么第二个不遍历呢?
            {
                System.Console.WriteLine(s);
            }
            System.Console.ReadLine();
        }
    }
}

[解决办法]
引用:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace yield_learn
{
    public class person : System.Collections.IEnumerable
    {
        #region IEnumerable
        public string x = "cc";
        public System.Collections.IEnumerator GetEnumerator()
        {
            yield return "1";
            Thread.Sleep(3000);
            yield return "2";
            Thread.Sleep(3000);
            yield return "3";
            Thread.Sleep(3000);
            yield return "4";
            Thread.Sleep(3000);
            yield return "5";
            Thread.Sleep(3000);
            yield return "6";



        }//是如何选择遍历哪个的??
        public System.Collections.IEnumerator getnum()
        {
            yield return "dshdjs";//为什么没有输出这个??
        }
        #endregion
    }
    class Program
    {
        static void Main(string[] args)
        {
            person arrperson = new person();
            foreach (string s in arrperson)//遍历一个类中的string吗,必须带有System.Collections.IEnumerator的才遍历,但是为什么第二个不遍历呢?
            {
                System.Console.WriteLine(s);
            }
            System.Console.ReadLine();
        }
    }
}



IEnumerable 用于foreach
IEnumerator  用于while(xxx.MoveNext())
明白了没。两个不一样。
[解决办法]
你去看下IEnumerable接口的定义,你再试试把GetEnumerator()函数删除是否会报错。GetEnumerator()是必须有的,而getnum()是可有可无的,foreach遍历只会使用必须存在的而不是可有可恶的方法,不是看返回值类型符合就会去用,而是看是否满足接口的规范。

热点排行