1. 程式人生 > >C#中的IEnumerable簡介及簡單實現實例

C#中的IEnumerable簡介及簡單實現實例

list orm 替換 valid src move codes 更新 使用

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#中的IEnumerable簡介及簡單實現實例

本文地址: http://www.paobuke.com/develop/c-develop/pbk23109.html






相關內容

技術分享圖片C#.Net基於正則表達式抓取百度百家文章列表的方法示例技術分享圖片C#連接MySQL的兩個簡單代碼示例技術分享圖片C# MVC 微信支付教程系列之掃碼支付代碼實例技術分享圖片C#êμ?????aêμó?μ?SQLhelper
技術分享圖片C#通過Semaphore類控制線程隊列的方法技術分享圖片C#實現的json序列化和反序列化代碼實例技術分享圖片C#中timer定時器用法實例技術分享圖片C#實現為類和函數代碼自動添加版權註釋信息的方法

C#中的IEnumerable簡介及簡單實現實例