当前位置: 首页 > 编程笔记 >

C#中的IEnumerable简介及简单实现实例

黄流觞
2023-03-14
本文向大家介绍C#中的IEnumerable简介及简单实现实例,包括了C#中的IEnumerable简介及简单实现实例的使用技巧和注意事项,需要的朋友参考一下

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,否则就是泛型接口的类型参数。

 类似资料:
  • 本文向大家介绍C及C++中typedef的简单使用介绍,包括了C及C++中typedef的简单使用介绍的使用技巧和注意事项,需要的朋友参考一下 typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。 在编程中

  • 本文向大家介绍C#实现简单的Http请求实例,包括了C#实现简单的Http请求实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现简单的Http请求的方法。分享给大家供大家参考。具体分析如下: 通过.Net中的两个类HttpWebRequest类,HttpWebResponse类来实现Http的请求,响应处理。 第一个小测试是请求百度首页(http://www.baidu.com)

  • 本文向大家介绍C#实现简单的Login窗口实例,包括了C#实现简单的Login窗口实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现简单的Login窗口。分享给大家供大家参考。具体实现方法如下: C# 制作登录窗体,登录成功之后正确的做法是关闭(close)登录窗体,而不是隐藏窗体(hide) FrmLogin窗体: Main方法入口: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C#实现简单获取及设置Session类,包括了C#实现简单获取及设置Session类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现简单获取及设置Session类。分享给大家供大家参考。具体分析如下: 这是一个简单的C#获取Session、设置Session类文件,本类主要实现大家最常用的两个功能: 1、GetSession(string name)根据session

  • 本文向大家介绍java  BASE64Encoder详细介绍及简单实例,包括了java  BASE64Encoder详细介绍及简单实例的使用技巧和注意事项,需要的朋友参考一下 java  BASE64Encoder详解 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。 Base64要

  • 本文向大家介绍c++实现简单的线程池,包括了c++实现简单的线程池的使用技巧和注意事项,需要的朋友参考一下 c++线程池,继承CDoit,实现其中的start和end 头文件 CPP文件 以上所述就是本文的全部内容了,希望大家能够喜欢。 请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!