博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#foreach的原理
阅读量:6675 次
发布时间:2019-06-25

本文共 3299 字,大约阅读时间需要 10 分钟。

foreach是对集合进行遍历,而集合都继承Array类foreach结构设计用来和可枚举类型一起使用,只要给它的遍历对象是可枚举类型只有实现了IEnumerable接口的类(也叫做可枚举类型)才能进行foreach的遍历操作,集合和数组已经实现了这个接口,所以能进行foreach的遍历操作集合继承IEnumerable这个接口,而IEnumerable的 IEnumerator GetEnumerator()方法 可以获得一个可用于循环访问集合的 对象        List
list = new List
() { "252", "哈哈哈", "25256", "春天里的花朵" }; Console.WriteLine(list.GetType().Name); IEnumerator listEnumerator = list.GetEnumerator(); while (listEnumerator.MoveNext()) { Console.WriteLine(listEnumerator.Current); } listEnumerator.Reset();

using System;

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 枚举器

{
///
/// 枚举器泛型类
///
class Enumerator : IEnumerator
{
private T[] array;
private int _postion = -1;

public Enumerator(T[] sum)    {        array = new T[sum.Length];        for (int i = 0; i < sum.Length; i++)        {            array[i] = sum[i];        }    }    public void Dispose()    {    }    ///     /// 把枚举器的位置前进到下一项,返回布尔值,    /// 新的位置若是有效的,返回true,否则返回false    ///     /// 
public bool MoveNext() { if (this._postion>=this.array.Length) { return false; } else { this._postion++; return _postion < this.array.Length; } } /// /// 将位置重置为原始状态 /// public void Reset() { this._postion = -1; } public T Current { get { if (this._postion == -1) { throw new InvalidOperationException(); } return array[this._postion]; } } object IEnumerator.Current { get { if (this._postion == -1) { throw new InvalidOperationException(); } return array[_postion]; } }}

}

using System;

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 枚举器

{
///
///可枚举类是指实现了IEnumerble接口的类 它里面只有一个方法,Getenumerator()
///它可以获得对象的枚举器
///
///
class enumable:IEnumerable
{
private T[] sum ;

public enumable(T[] array)    {        sum =new T[array.Length];        for (int i = 0; i < array.Length; i++)        {            sum[i] = array[i];        }    }    public IEnumerator
GetEnumerator() { return new Enumerator
(sum); } IEnumerator IEnumerable.GetEnumerator() { return new Enumerator
(sum); }}

}

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 枚举器

{
class Program
{
static void Main(string[] args)
{

//可枚举类是指实现了IEnumerble接口的类 它里面只有一个方法,Getenumerator()       //它可以获得对象的枚举器        int[] sum = {5, 8, 5, 8, 11};        string[] array = {"哈哈", "ii", "5222"};        enumable
intenumable=new enumable
(sum); foreach (int temp in intenumable) { Console.Write(temp + "\t"); } Console.WriteLine(); enumable
stringEnumable=new enumable
(array); foreach (string temp in stringEnumable) { Console.Write(temp+"\t"); } Console.ReadKey(); }}

}

转载地址:http://wdrxo.baihongyu.com/

你可能感兴趣的文章
Java gc中能聊的那些事
查看>>
如何判断一个以太坊地址是不是合约?
查看>>
逆袭!? 期待下一个“BCH”出现
查看>>
Linux 终端下全能系统监控工具 dstat
查看>>
自动化运维工具Ansible的安装(资源)
查看>>
Oracle-如何收集统计信息
查看>>
opengl es3.0学习篇五:图元装配跟光栅化
查看>>
Linux硬盘的分区挂载与光盘的挂载(二)—fdisk分区的操作步骤
查看>>
阿里巴巴上线静态开源站点搭建工具 Docsite
查看>>
如何使用Data Lake Analytics创建分区表
查看>>
您对TOP Server的德语、中文和日语语言支持了解吗?(一)
查看>>
基于 Spring Boot 和 Spring Cloud 实现微服务架构
查看>>
Qt之添加菜单项&状态栏
查看>>
负载均衡在分布式架构中是怎么玩起来的?
查看>>
Java程序员在工作的同时应该具备什么样的能力?
查看>>
Dubbo深入分析之Cluster层
查看>>
分析Padavan源代码,二
查看>>
WordPress的WPML外挂出问题恐出现安全漏洞
查看>>
Django 调试技巧
查看>>
Spring Boot和thymeleaf , freemarker , jsp三个前端模块的运用
查看>>