本质:实现了一个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. 【.net】从比较两个字节数组谈起

    上午,有位初学者朋友问:如何比较两个字节数组中各字节是否相等? 不许笑,我一向反对嘲笑初学者,初学者不认真学习时你可以批评,但不能讥嘲.你不妨想想,你自己开始学习编程的时候又是什么个光景? 好,于是, ...

  2. dropzone的使用方法

    http://www.renfei.org/blog/dropzone-js-introduction.html dropzone.js 是一个开源的 JavaScript 库,提供 AJAX 异步上 ...

  3. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...

  4. jsp获得文件的绝对路径

    当前WEB应用的物理路径:<%=application.getRealPath("/")%>当前访问的JSP文件的物理路径:<%=application.getR ...

  5. 让div垂直以及水平居中浏览器窗口

    首们需要position:absolute;绝对定位,或者position:fixed.而层的定位点,使用外补丁margin负值的方法.负值的大小为层自身宽度高度除以二. 如:一个层宽度是400,高度 ...

  6. spring aop源码实现分析

    1. 先分析Advice before执行Cglib2AopProxy的intercept方法: /** * General purpose AOP callback. Used when the t ...

  7. sql server 利用发布订阅方式实现数据库同步问题

    删除本地快发布时报错: 无法作为数据库主体执行,因为主体 "dbo" 不存在.无法模拟这种类型的主体,或您没有所需的权限.已将数据库上下文更改为 'numberForcast'. ...

  8. JS&CSS文件请求合并及压缩处理研究(五)

    接上篇.在我们最终调用 @Html.RenderResFile(ResourceType.Script) 或者 @Html.RenderResFile(ResourceType.StyleSheet) ...

  9. position属性absolute与relative 详解

    最近一直在研究javascript脚本,熟悉DOM中CSS样式的各种定位属性,以前对这个属性不太了解,从网上找到两篇文章感觉讲得很透彻,收藏下来,唯恐忘记.一.解读absolute与relative ...

  10. [Asp.net 5] DependencyInjection项目代码分析2-Autofac

    Microsoft.Framework.DependencyInjection.Autofac源码分析 该工程只有一个代码静态类AutofacRegistration,但是该类有3个扩展方法,以及3个 ...