本质:实现了一个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原理的更多相关文章

  1. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

  2. Array.forEach原理,仿造一个类似功能

    Array.forEach原理,仿造一个类似功能 array.forEach // 设一个arr数组 let arr = [12,45,78,165,68,124]; let sum = 0; // ...

  3. 浅析foreach原理

    在日常开发工作中,我们发现很多对象都能通过foreach来遍历,比如HashTable.Dictionary.数组等数据类型.那为何这些对象能通过foreach来遍历呢?如果写一个普通的Person类 ...

  4. C#学习笔记:foreach原理

    这篇随笔是对上一篇随笔C#关键字:yield的扩展. 关于foreach 首先,对于 foreach ,大家应该都非常熟悉,这里就简单的描述下. foreach 语句用于对实现  System.Col ...

  5. C#foreach原理

    本文主要记录我在学习C#中foreach遍历原理的心得体会. 对集合中的要素进行遍历是所有编码中经常涉及到的操作,因此大部分编程语言都把此过程写进了语法中,比如C#中的foreach.经常会看到下面的 ...

  6. Foreach 原理

    public class Person { private string[] friends = { "asf", "ewrqwe", "ddd&qu ...

  7. C# foreach 原理以及模拟的实现

    public class Person:IEnumerable     //定义一个person类  并且 实现IEnumerable 接口  (或者不用实现此接口 直接在类 //里面写个GetEnu ...

  8. 涉及 C#的 foreach问题

    当时是用foreach实现遍历,但是函数传入参数是Object类型的,由于Objectl类型没有实现相关接口,所以foreach并不能执行. 那么下面我们来看看,想要使用foreach需要具备什么条件 ...

  9. mybatis foreach 循环 list(map)

    直接上代码: 整体需求就是: 1.分页对象里面有map map里面又有数组对象 2.分页对象里面有list list里面有map map里面有数组对象. public class Page { pri ...

随机推荐

  1. Js内存回收

    Javascript的世界中,隐藏了很多内存陷阱,不能得到合理释放的内存会埋下各种隐患,本文旨在以实用角度去解读Js涉及到的内存,且看勇士如何斗恶龙~ javascript 内存 回收 本文可以看做是 ...

  2. GridView里做页面的链接

    采用Gridview的OnRowDataBound属性 后台 protected void gvTranslateInfo_RowDataBound(object sender, GridViewRo ...

  3. 用户代理字符串userAgent可实现的四个识别

    定义 用户代理字符串:navigator.userAgent HTTP规范明确规定,浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号.但现实中却没有这么简单. 发展历史 [1]1993年美 ...

  4. hdu1548 A strange lift(bfs 或Dijkstra最短路径)

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #d ...

  5. java中匿名类的注意细节

    abstract class Outer{ int num; public Outer(int x){ num = x; } public abstract void show1(); public ...

  6. 使用Nginx配置NodeJs程序(Windows平台)

    简介 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由 Igor Sysoev ...

  7. [Node.js] 使用node-forge保障Javascript应用的传输安全

    原文地址:http://www.moye.me/2015/12/19/protect_jsapp_tsl_by_using_node-forge/ 引子 半年前的最后一次更新(惭愧  ),提到了对称与 ...

  8. NodeJS实战:Express+Mongoose+ejs

    元宵还没到,先向所有朋友拜一个晚年~~~ 文章目录: 1.组件版本号 -- --node -- --express -- --Mongoose 2.初始化项目 firstblood -- --用 ex ...

  9. SQL Server 存储(4/8):理解Page Free Space (PFS) 页

    我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free Space (PFS) ). PFS在数据文件里是第2页(页号1,页号从0开始),接 ...

  10. C#多线程技术总结(同步)

    二.串行(同步): 1.lock.Monitor--注意锁定的对象必需是引用类型(string类型除外) 示例: private static object syncObject = new obje ...