当时是用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[] = "宝马";
p[] = "奥迪";
p[] = "阿斯顿马丁";
//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 = -; #region IEnumerator 成员 //表示获取当前正在遍历的那个对象
public object Current
{
get
{
if (index < )
{
return null;
}
return cars[index];
}
}
//让自定义下标index累加
public bool MoveNext()
{
index = index + ;
if (index >= cars.Count)
{
return false;
}
else
{
return true;
}
} public void Reset()
{
index = -;
} #endregion
}
}

如果大家想要详细了解 foreach语句。建议大家学习一下迭代器。

参考网址

http://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html

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

  1. php中的foreach问题(1)

    前言 php4中引入了foreach结构,这是一种遍历数组的简单方式.相比传统的for循环,foreach能够更加便捷的获取键值对.在php5之前,foreach仅能用于数组:php5之后,利用for ...

  2. 深入解析php中的foreach问题

    本篇文章是对php中的foreach问题进行了详细的分析介绍,需要的朋友参考下   前言:php4中引入了foreach结构,这是一种遍历数组的简单方式.相比传统的for循环,foreach能够更加便 ...

  3. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  4. Foreach遍历

    前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable<Order>,代码如下: foreach (Orde ...

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

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

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

    引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Hom ...

  7. foreach 相关

    20 Nov 08 深入理解PHP原理之foreach 作者: Laruence(   ) 本文地址: http://www.laruence.com/2008/11/20/630.html 转载请注 ...

  8. C# Winform 涉及的拖放操作总结

    在开发程序的时候,为了提高用户的使用体验,或满足相关用户的功能,总是离不开拖放功能.而本文是总结winform下的常用拖放操作.主要有 1.textbox接受拖放的文件2.listbox允许用户自定义 ...

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

    一. foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素.      该循环 ...

随机推荐

  1. (转)SQL Server 的事务和锁(二)-Range S-S锁

    在这篇随笔中,我们的主要关注点在 Key-Range Lock.Key-Range Lock有 S-S.S-U.I-N.X-X几种情况.我们一个一个来说,力求明白.遗憾的是,这里可能会比较冗长,那么死 ...

  2. 数据库路由器 ICX

    实时并发数据库事务处理同步复制器和负载平衡器    ———通向真正数据库高可用性,高可靠性,高性能之路 一.产品概述    数据库路由器--ICX是美国宾夕法尼亚大学计算机系施教授经过多年研究.开发出 ...

  3. IOS多线程(GCD)

    简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...

  4. ubuntu下Tomcat7的安装和配置

    和前几个软件一样,Tomcat 同样是由JAVA开发的,所以,在安装前一定要装好JDK. 大家可以到 http://tomcat.apache.org/download-70.cgi 下载最新的Tom ...

  5. 【python】lxml-The E-factory

    来自:http://lxml.de/tutorial.html lxml中的E-factory可以用个简单快速的生成XML和HTML >>> from lxml.builder im ...

  6. 获取4G以上的文件大小

    1.DWORD dwFileSizeHigh;  // 得到文件大小的高位  __int64 qwFileSize = GetFileSize(m_hSrcBigFile, &dwFileSi ...

  7. python基础——函数的参数

    python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...

  8. Reactor模式详解

    转自:http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html 前记 第一次听到Reactor模式是三年前的某个晚上,一个室友突然跑过 ...

  9. jQuery 重新温习 遗忘知识点

    解决jQuery和其他库的冲突 当把jQuery和其他JavaScript库(例如Prototype.MooTools或YUI)一起使用时 <script> jQuery.noConfli ...

  10. UVa 11524:In-Circle(解析几何)

    Problem EIn-CircleInput: Standard Input Output: Standard Output In-circle of a triangle is the circl ...