Foreach原理
本质:实现了一个IEnumerable接口,
01.为什么数组和集合可以使用foreach遍历?
解析:因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerator()
02.数组是一种数据结构,它包含若干相同类型的变量。数组是使用类型声明的:type[] arrayName;
03.数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable ,因此可以对 C# 中的所有数组使用 foreach 迭代。(摘自MSDN)
我们都知道foreach可以遍历ArrayList集合
我们可以F12过去看看它的内部微软写好的代码
01.
.
02.

03.

04.

下面我们自己来模拟实现微软的方法:
1.MyCollection类实现IEnumerable接口

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Foreach原理
{
//自定义类型:实现IEnumerable接口,证明这个类型保存的数据能被foreach遍历
public class MyCollection : IEnumerable
{
//01给集合添值得方法
public void Add(object o)
{
list.Add(o);
}
//02定义一个集合
ArrayList list = new ArrayList();
//03实现GetEnumerator方法
public IEnumerator GetEnumerator()
{
return new MyIEnumerator(list);
}
}
}

02.MyIEnumerator类实现IEnumerator接口

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Foreach原理
{
//IEnumerator:支持对非泛型集合的简单迭代
public class MyIEnumerator : IEnumerator
{
//定义一个List集合
ArrayList list = new ArrayList(); public MyIEnumerator(ArrayList mylist)
{
//给当前类的集合赋值
list = mylist;
}
//默认将集合的索引指向前一个 即第一条数据之前
private int i = -1; //返回当前循环遍历索引的值
public object Current
{
get { return list[i]; }
}
//实现接口的Movenext方法
public bool MoveNext()
{
bool flag = false;//默认为没有数据
if (i < list.Count - 1)
{
//证明集合中有数据让索引加1
i++;
//改变bool值为true
flag = true;
}
return flag;
}
//把i初始化为-1
public void Reset()
{
i = -1;
}
}
}

03.在Main方法中调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Foreach原理
{
class Program
{
static void Main(string[] args)
{
//01.实例化实现了IEnumerable接口的MyCollection类
MyCollection list = new MyCollection();
//02.向集合添加元素
list.Add("小张");
list.Add("小王");
//03.方可使用foreach循环遍历出结果
foreach (string item in list)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
}

这就是foreach遍历集合或数组的原理或实质。
分享面试题------
Foreach原理的更多相关文章
- .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...
- Array.forEach原理,仿造一个类似功能
Array.forEach原理,仿造一个类似功能 array.forEach // 设一个arr数组 let arr = [12,45,78,165,68,124]; let sum = 0; // ...
- 浅析foreach原理
在日常开发工作中,我们发现很多对象都能通过foreach来遍历,比如HashTable.Dictionary.数组等数据类型.那为何这些对象能通过foreach来遍历呢?如果写一个普通的Person类 ...
- C#学习笔记:foreach原理
这篇随笔是对上一篇随笔C#关键字:yield的扩展. 关于foreach 首先,对于 foreach ,大家应该都非常熟悉,这里就简单的描述下. foreach 语句用于对实现 System.Col ...
- C#foreach原理
本文主要记录我在学习C#中foreach遍历原理的心得体会. 对集合中的要素进行遍历是所有编码中经常涉及到的操作,因此大部分编程语言都把此过程写进了语法中,比如C#中的foreach.经常会看到下面的 ...
- Foreach 原理
public class Person { private string[] friends = { "asf", "ewrqwe", "ddd&qu ...
- C# foreach 原理以及模拟的实现
public class Person:IEnumerable //定义一个person类 并且 实现IEnumerable 接口 (或者不用实现此接口 直接在类 //里面写个GetEnu ...
- 涉及 C#的 foreach问题
当时是用foreach实现遍历,但是函数传入参数是Object类型的,由于Objectl类型没有实现相关接口,所以foreach并不能执行. 那么下面我们来看看,想要使用foreach需要具备什么条件 ...
- mybatis foreach 循环 list(map)
直接上代码: 整体需求就是: 1.分页对象里面有map map里面又有数组对象 2.分页对象里面有list list里面有map map里面有数组对象. public class Page { pri ...
随机推荐
- localStorage使用
localStorage使用 需要注意的是,HTML5本地存储只能存字符串,任何格式存储的时候都会被自动转为字符串,所以读取的时候,需要自己进行类型的转换. 支持的情况如上图,IE在8.0的时候就支持 ...
- css text-align-last设置末尾文本对齐方式
text-align-last:auto | start | end | left | right | center | justify auto: 无特殊对齐方式. left: 内容左对齐. cen ...
- Geometry Curve of OpenCascade BRep
Geometry Curve of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲线是参数表示的曲线 ,在边界表示中其数据存在于BRep_TEdge中,BR ...
- 用MVVM做了一个保存网页的工具-上篇
前言: 你是否有过收藏了别人博客或文章,当想用的时候却找不到?你是否有过收藏了别人博客或文章,却因为没有网络而打不开网页?OK,下面是我做的一个工具,有兴趣的同学们可以download 玩下,哈哈^. ...
- javascript类型系统——日期Date对象
× 目录 [1]静态方法 [2]构造函数 [3]实例方法 前面的话 Date对象是javascript语言中内置的数据类型,用于提供日期和时间的操作接口.Date对象是在早期java中的java.ut ...
- poj 2777(线段树的节点更新策略)
/* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...
- tomcat本地部署war包的方式
最近学习java,在本地tomcat部署时,主要采取以下方式: 一.本地构建生成war包 在本地项目中的terminal下,使用命令 “mvn clean install”或 先执行“mvn clea ...
- (转)清理AIX的/var文件系统大小
在ROOTVG空间有限,且/var文件系统的空间已经足够大的情况下,/var文件系统空间快满了,这种情况怎么处理?IBM给了一个很好的处理流程: 使用find 命令检查在/var目录中所有大于1MB的 ...
- Ext.Net全部Icon图标名称展示
- Deep learning:五十(Deconvolution Network简单理解)
深度网络结构是由多个单层网络叠加而成的,而常见的单层网络按照编码解码情况可以分为下面3类: 既有encoder部分也有decoder部分:比如常见的RBM系列(由RBM可构成的DBM, DBN等),a ...