涉及 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[] = "宝马";
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问题的更多相关文章
- php中的foreach问题(1)
前言 php4中引入了foreach结构,这是一种遍历数组的简单方式.相比传统的for循环,foreach能够更加便捷的获取键值对.在php5之前,foreach仅能用于数组:php5之后,利用for ...
- 深入解析php中的foreach问题
本篇文章是对php中的foreach问题进行了详细的分析介绍,需要的朋友参考下 前言:php4中引入了foreach结构,这是一种遍历数组的简单方式.相比传统的for循环,foreach能够更加便 ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
- Foreach遍历
前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable<Order>,代码如下: foreach (Orde ...
- Java语法糖1:可变长度参数以及foreach循环原理
语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...
- MVC路由探寻,涉及路由的惯例、自定义片段变量、约束、生成链接和URL等
引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Hom ...
- foreach 相关
20 Nov 08 深入理解PHP原理之foreach 作者: Laruence( ) 本文地址: http://www.laruence.com/2008/11/20/630.html 转载请注 ...
- C# Winform 涉及的拖放操作总结
在开发程序的时候,为了提高用户的使用体验,或满足相关用户的功能,总是离不开拖放功能.而本文是总结winform下的常用拖放操作.主要有 1.textbox接受拖放的文件2.listbox允许用户自定义 ...
- c#--foreach遍历的用法与split的用法
一. foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素. 该循环 ...
随机推荐
- iOS 中constraint 不等于约束和低优先级约束使用的简单体会
看了些文章发现,在使用constraint时,不等于约束往往是和低优先级约束成对使用的,这样才能实现他们的效果. 看看例子 下面是在3.5存屏幕下的效果 图1,竖屏,在满足>=50的前提下,可以 ...
- iOS 利用constraint实现2个控件上下的空白是相等的
说的有点乱,先看个图把 其实这个constrant的目的就是控制两个方形的控件上方和下方的空白大小. 对于每一个方块来说,他们上方和下方的空白是相同的.这种“居中”的设计到处可见.一个控件想实现这种居 ...
- TinyMCE textarea 输入框外部程序动态修改方法
TinyMCE textarea 输入框外部程序动态修改方法 Public Function C2IE_TINYMCE(ByVal id As String, ByVal value As Strin ...
- 新建myeclipse工作空间需要的工作
接触了许多个项目,都挺大的,每次都需要配置,简单总结总结. 第一.右击项目,选择Text file encoding 第二.点击window-->preferences-->myeclip ...
- 【2016-08-06】QTableWidget的一些用法总结
1. QTableWidget的列宽如何自适应显示区域大小? QTableWidget的列头继承自QHeaderView,因此如果不使用固定列宽而需要Table中多列的列宽自适应显示区域大小的话, 可 ...
- 二、JavaScript语言--JS基础--JavaScript入门篇
1.如何插入JS 使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要成对出现,并把JavaScript代码写在<scri ...
- mysql TIMESTAMP详解
navicat中设置timestamp字段的时间,默认这里填写CURRENT_TIMESTAMP,就是在插入数据的时候按照当前时间插入: 勾选根据当前时间戳更新,表示在UPDATE的时候,会根据当前时 ...
- [杂]SQL Server 之 Understanding Connection Pooling and Transactions
A SqlConnection consists of two parts: the public instance that your code interacts with (the outer ...
- phpcms v9 首页怎么调取单页内容,描述,标题等
{pc:, v9 数据表前缀 catid 这是单页的id
- 了解Json
Json(JavaScript Object Notation) 是一种轻量级的数据交换格式,它是基于JavaScript的一个子集. 数据格式简单, 易于读写, 占用带宽小. {'age':'12' ...