码迷,mamicode.com
首页 > Windows程序 > 详细

涉及 C#的 foreach问题

时间:2016-07-04 13:37:37      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

当时是用foreach实现遍历,但是函数传入参数是Object类型的,由于Objectl类型没有实现相关接口,所以foreach并不能执行。

那么下面我们来看看,想要使用foreach需要具备什么条件。

需要实现IEnumerable接口或声明GetEnumerator方法的类型。

 下面我们来看看foreach原理,

参考原文  http://blog.csdn.net/guobin_lu/article/details/8812092

为什么有些类可以可以用foreach遍历,有些类却不可以了.经反编译过后得出:

技术分享

 

 

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Collections;  
      
    namespace Myforeach  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {        
                Person p = new Person();  
                p[0] = "宝马";  
                p[1] = "奥迪";  
                p[2] = "阿斯顿马丁";  
                //for (int i = 0; i < p.Count; i++)  
                //{  
                //    Console.WriteLine(p[i]);  
                //}  
      
                //任何类型,只要想使用foreach来循环遍历,就必须在当前类型中  
                //存在: public IEnumerator GetEnumerator()方法,(一般情况我们会通过实现IEnumerable接口,来创建该方法。)  
                foreach (string item in p)  
                {  
                    Console.WriteLine(item);  
                }  
      
                //IEnumerator etor = p.GetEnumerator();  
                //while (etor.MoveNext())  
                //{  
                //    string str = etor.Current.ToString();  
                //    Console.WriteLine(str);  
                //}  
                Console.ReadKey();  
      
      
            }  
        }  
      
        public class Person : IEnumerable  
        {  
            private List<string> listCar = new List<string>();  
      
            public int Count  
            {  
                get  
                {  
                    return this.listCar.Count;  
                }  
      
            }  
      
            public string this[int index]  
            {  
                get  
                {  
                    return listCar[index];  
                }  
      
                set  
                {  
                    if (index >= listCar.Count)  
                    {  
                        listCar.Add(value);  
                    }  
                    else  
                    {  
                        listCar[index] = value;  
                    }  
                }  
            }  
            public string Name  
            {  
                get;  
                set;  
            }  
            public int Age  
            {  
                get;  
                set;  
            }  
            public string Email  
            {  
                get;  
                set;  
            }  
     
            #region IEnumerable 成员  
      
            //这个方法的作用不是用来遍历的,而是用来获取一个对象  
            //这个对象才是用来遍历的。  
            public IEnumerator GetEnumerator()  
            {  
                return new PersonEnumerator(listCar);  
            }  
     
            #endregion  
        }  
      
        //这个类型,的作用就是用来遍历Person中的List集合的。  
        public class PersonEnumerator : IEnumerator  
        {  
            public PersonEnumerator(List<string> _cars)  
            {  
                cars = _cars;  
            }  
      
            //这个字段中存储的就是Person对象中的listCar集合  
            private List<string> cars;  
      
      
            //假设一开始遍历的对象的索引是-1  
            private int index = -1;  
     
            #region IEnumerator 成员  
      
      
            //表示获取当前正在遍历的那个对象  
            public object Current  
            {  
                get  
                {  
                    if (index < 0)  
                    {  
                        return null;  
                    }  
                    return cars[index];  
                }  
            }  
            //让自定义下标index累加  
            public bool MoveNext()  
            {  
                index = index + 1;  
                if (index >= cars.Count)  
                {  
                    return false;  
                }  
                else  
                {  
                    return true;  
                }  
            }  
      
            public void Reset()  
            {  
                index = -1;  
            }  
     
            #endregion  
        }  
    }  

 

涉及 C#的 foreach问题

标签:

原文地址:http://www.cnblogs.com/wenjieyatou/p/5639910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!