涉及 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 CoreData学习资料 和 问题
这里是另一篇好文章 http://blog.csdn.net/kesalin/article/details/6739319 这里是另一篇 http://hxsdit.com/1622 (不一定能访问 ...
- DP:Corn Fields(POJ 3254)
北大教你如何高效养牛(误)(点我查看) 2015-08-21: 问题的大意就是有一片稻田,里面有很多坑,你要在上面种稻谷,然后呢田里面还会养牛,牛不喜欢扎堆吃饭,所以呢你种的稻谷要间隔种在坑里面,所 ...
- codeforces A. New Year Candles 解题报告
题目链接:http://codeforces.com/problemset/problem/379/A 题目意思:给定a支蜡烛(每支蜡烛可以燃烧1小时),可以在燃尽的a支蜡烛中看能组成多少组b支蜡烛, ...
- Extjs给gridPanel添加单价双击事件和获取当前行的数据
有两个小属性,如下 this.on('rowdblclick', this.readContent, this); this.on('cellclick', this.gridCellClick, t ...
- 谈JavaScript代码封装
前言 也算老生常谈的问题了,再深入搞一搞怎么玩儿封装,如果看到这篇文章的你,正好你也是追求完美的代码洁癖狂者,那么这篇文章相信非常适合你. 举一个例子,编写一个Person类,具有name和birth ...
- Linux创建用户并赋予Root权限
添加普通用户 [root@server ~]# useradd test //添加一个名为test的用户[root@server ~]# passwd test //修改密码Changing pass ...
- Solr常用查询语法笔记
1.常用查询 q - 查询字符串,这个是必须的.如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京) fq - (filter query)过虑查询,作用:在q查询符 ...
- Ubuntu could not write bytes broken pipe
一.环境变量问题 1 到登录界面的时候,进入命令行模式: alt+ctrl+F1 2 登录 3 修改环境变量(当我输入ls的时候 竟然没有找到命令,然后果断的知道是环境变量的事情,于是改之!) 4 ...
- 【现代程序设计】homework-08
1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理解 #include <iostream>int main() { ; ;i<;i++); ...
- 必应缤纷桌面的必应助手-软件分析和用户市场需求之-----二.体验部分 Ryan Mao (毛宇11061171) (完整版本请参考团队博客)
<必应缤纷桌面的必应助手> 2.体验部分 Ryan Mao (毛宇11061171) (完整分析报告请参考团队博客http://www.cnblogs.com/Z-XML/) 我花了2天的 ...