涉及 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
        }
    }  
时间: 2024-10-22 22:58:53

涉及 C#的 foreach问题的相关文章

深入解析php中的foreach问题

本篇文章是对php中的foreach问题进行了详细的分析介绍,需要的朋友参考下 前言:php4中引入了foreach结构,这是一种遍历数组的简单方式.相比传统的for循环,foreach能够更加便捷的获取键值对.在php5之前,foreach仅能用于数组:php5之后,利用foreach还能遍历对象(详见:遍历对象).本文中仅讨论遍历数组的情况. foreach虽然简单,不过它可能会出现一些意外的行为,特别是代码涉及引用的情况下.下面列举了几种case,有助于我们进一步认清foreach的本质.

c#--foreach遍历的用法与split的用法

一. foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素.该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值.放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行.一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面的执行语句. foreach语句经常与数组一起使用,下面实例将通

foreach

foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素. 该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值.放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行.一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面 的执行语句. foreach语句经常与数组一起使用,下面实例将通过

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

建议17:多数情况下使用foreach进行循环遍历 由于本建议涉及集合的遍历,所以在开始讲解本建议之前,我们不妨来设想一下如何对结合进行遍历.假设存在一个数组,其遍历模式可以采用依据索引来进行遍历的方法:又假设存在一个HashTable,其遍历模式可能是按照键值来进行遍历.无论是哪个集合,如果他们的遍历没有一个公共的接口,那么客户端在进行遍历时,相当于是对具体类型进行了编码.这样一来,当需求发生变化时,必须修改我们的代码.而且,由于客户端代码过多地关注了集合内部的实现,代码的可移植性就会变得很差

MVC路由探寻,涉及路由的惯例、自定义片段变量、约束、生成链接和URL等

引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Home/Index中,包含2个片段,第一个片段是Home,第二个片段是Index. URL匹配的特点:● 保守的:URL中的片段数量必须和路由规则中的片段数量一致(路由规则没有设置默认值的前提下)● 宽松的:在满足片段数要求的前提下,URL中的片段内容是宽松的 本篇涉及的方面包括:1.路由惯例2.自定义片段变量3

Foreach遍历

前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable<Order>,代码如下: foreach (Order item in responses) { if (string.IsNullOrEmpty(item.Creator)) item.Creator = item.Creator2; } 结果可想而知,response的对象并没有被改变.这是为什么? 弄清楚问题之前需要明白什么是foreach.foreac

foreach循环原理

转载自:http://www.cnblogs.com/xrq730/p/4868465.html 以前对foreach循环就是这么用着,触动我去研究foreach循环的原理的原因是大概两个月前,自己写了一个ArrayList,想用foreach循环遍历一下看一下写的效果,结果报了空指针异常.本文就写写foreach循环的原理,先看一下这么一段代码: public static void main(String[] args) { List<String> list = new ArrayLis

Java语法糖1:可变长度参数以及foreach循环原理

语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了.这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能.或能提升语法的严谨性.或能减少编码出错的机会.Java提供给了用户大量的语法糖,比如泛型.自动装箱.自动拆箱.foreach循环.变长参数.内部类.枚举类.断言(as

Java:foreach实现原理

第一部分: For-each Loop Purpose The basic for loop was extended in Java5 to make iteration over arrays and other collections more convenient. This newer for statement is called the enhanced for or for-each (because it is called this in other programming