涉及 C#的 foreach问题

Posted 文洁丫头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涉及 C#的 foreach问题相关的知识,希望对你有一定的参考价值。

当时是用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问题的主要内容,如果未能解决你的问题,请参考以下文章

编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历

在 C# 中使用 CreateDirectory 避免 NotSupportedException

C# 最有用的(自定义)代码片段是啥? [关闭]

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

是否可以动态编译和执行 C# 代码片段?

优化 C# 代码片段、ObservableCollection 和 AddRange