C#中的IEnumerable简介及简单实现实例
作者:junjie 发布时间:2023-07-15 22:27:07
IEnumerable这个接口在MSDN上是这么说的,它是一个公开枚举数,该枚举数支持在非泛型集合上进行简单的迭代。换句话说,对于所有数组的遍历,都来自IEnumerable,那么我们就可以利用这个特性,来定义一个能够遍历字符串的通用方法.
下面先贴出code.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace mycs
{
class Program
{
static void Main(string[] args)
{
charlist mycharlist = new charlist("hello world");
foreach (var c in mycharlist)
{
Console.Write(c);
}
Console.ReadLine();
}
}
class charlist : IEnumerable
{
public string TargetStr { get; set; }
public charlist(string str)
{
this.TargetStr = str;
}
public IEnumerator GetEnumerator()
{
//c# 1.0
return new CharIterator(this.TargetStr);
//c# 2.0
/*
for (int index = this.TargetStr.Length; index > 0;index-- )
{
yield return this.TargetStr[index - 1];
}
*/
}
}
class CharIterator : IEnumerator
{
public string TargetStr { get; set; }
public int position { get; set; }
public CharIterator(string targetStr)
{
this.TargetStr = targetStr;
this.position = this.TargetStr.Length;
}
public object Current
{
get
{
if (this.position==-1||this.position==this.TargetStr.Length)
{
throw new InvalidOperationException();
}
return this.TargetStr[this.position];
}
}
public bool MoveNext()
{
if (this.position!=-1)
{
this.position--;
}
return this.position > -1;
}
public void Reset()
{
this.position = this.TargetStr.Length;
}
}
}
在上面的例子c# 1.0中,CharIterator就是迭代器的实现,position字段存储当前的迭代位置,通过Current属性可以得到当前迭代位置的元素,MoveNext方法用于更新迭代位置,并且查看下一个迭代位置是不是有效的。
当我们通过VS单步调试下面语句的时候:
foreach (var c in charList)
代码首先执行到foreach语句的charList处获得迭代器CharIterator的实例,然后代码执行到in会调用迭代器的MoveNext方法,最后变量c会得到迭代器Current属性的值;前面的步骤结束后,会开始一轮新的循环,调用MoveNext方法,获取Current属性的值。
通过C# 1.0中迭代器的代码看到,要实现一个迭代器就要实现IEnumerator接口,然后实现IEnumerator接口中的MoveNext、Reset方法和Current属性。
在C# 2.0中可以直接使用yield语句来简化迭代器的实现。
如上面public IEnumerator GetEnumerator()方法中注释掉的部分。
通过上面的代码可以看到,通过使用yield return语句,我们可以替换掉整个CharIterator类。
yield return语句就是告诉编译器,要实现一个迭代器块。如果GetEnumerator方法的返回类型是非泛型接口,那么迭代器块的生成类型(yield type)是object,否则就是泛型接口的类型参数。


猜你喜欢
- 在使用Java web开发的后端工程师们大多会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,更加关注maven的细节是
- 关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListVie
- 本文为大家分享了使用entrySet方法获取Map集合中元素的具体代码,供大家参考,具体内容如下/*--------------------
- 本文实例讲述了C#遍历操作系统下所有驱动器的方法。分享给大家供大家参考。具体分析如下:这里先通过DriveInfo类的GetDrivers方
- 场景:使用MyBatis批量查询(select)、批量插入(insert)、批量更新(update)、批量删除(delete)操作MySQL
- Android权限Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读写用
- Android application捕获崩溃异常怎么办?通用 application1、收集所有 avtivity 用于彻底退出应用2、捕
- 美团外卖菜单界面的Android实现代码,供大家参考,具体内容如下布局文件总布局<?xml version="1.0&quo
- 1. F1弹出帮助文档先找个后缀是pdf、docx等格式的的帮助文档,将它放在项目的helpDoc下。设置其“复制到输出
- 学习Demo contains方法:用于判断list集合是否包含某个元素containsKey方法:用于判断Map键中是否包含某个
- 1)首先启动hadoop2个进程,进入hadoop/sbin目录下,依次启动如下命令[root@node02 sbin]# pwd/usr/
- 服务端package lesson02;import java.io.*;import java.net.ServerSocket;impo
- 本文实例为大家分享了Android来电拦截的方法,供大家参考,具体内容如下权限 <uses-permission andr
- 经常遇到的问题在实际得开发过程中,我们经常会遇到以下场景,我们后端请求某个接口后获取到得数据,不希望将所有字段都返回给前端,那么我们需要封装
- 目录一、单例模式饿汉模式懒汉模式懒汉模式二、堵塞队列实现BlockingQueue三、定时器总结一、单例模式单例模式是一种设计模式,针对一些
- 想做一个APP,设计中有侧边栏这个功能,所以现在开始学习下侧边栏的实现。在官方的UI空间中已经给出了DrawerLayout这个侧滑的菜单空
- 连接操作redisSpring Boot中操作redis还是需要使用相关的启动器<dependency><groupId&
- 按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Co
- 本文在实现雪花效果的基础上,根据漫天飞舞雪花,实现下雨天场景的效果,使用eclipse android 版本,具体内容如下雪花效果图:具体代
- @RequestBody配合@Valid校验入参参数自定义一个Controllerimport com.example.demo.pojo.