最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# IEnumerable和IEnumerator接口淺析

 更新時間:2017年02月23日 11:05:52   作者:山治先生  
本文主要介紹了C#中IEnumerable和IEnumerator接口的相關(guān)知識,具有很好的參考價值,下面跟著小編一起來看下吧

溫故而知新,可以為師矣,有空經(jīng)常復(fù)習(xí)一下基礎(chǔ)知識是有必要的,并且能加深理解和記憶。

Foreach常用于循環(huán)訪問集合,對實現(xiàn)IEnumerable的接口的容器進(jìn)行遍歷,IEnumerable和IEnumerator接口我有時候也有點迷糊,按官方的解釋,IEnumerable是枚舉器接口,IEnumerator是迭代器接口,從字面意思來看相差不大,逐一分析一下。

IEnumerable接口

public interface IEnumerable
{ 
 IEnumerator GetEnumerator();
}

繼承IEnumerable接口的類需實現(xiàn)暴露出來的GetEnumerator()方法,并返回一個IEnumerator接口對象,看來真正做事的是IEnumerator,F(xiàn)12看一下IEnumerator又有什么鬼東西。

IEnumerator接口

public interface IEnumerator
{ 
 object Current { get; }
 bool MoveNext(); 
 void Reset();
}

IEnumerator接口有三個東東,一個屬性Current,返回當(dāng)前集合中的元素,方法MoveNext()移動到下一個,遍歷不都是向后遍歷的嘛,Reset(),字面意思重置,這個容易理解。做個假設(shè):既然IEnumerable接口返回是IEnumerator接口迭代器來實現(xiàn)的,那么僅繼承IEnumerator迭代器接口能不能實現(xiàn)一個自定義容器?

定義一個Phone類

public class Phone 
{
 public string Name;
 public Phone(string name)
 {
  this.Name = name;
 }
}

定義一個名為MyEnumerator迭代器,并現(xiàn)實它接口IEnumerator

public class MyEnumerator : IEnumerator
{
 Phone[] p;
 int idx = -1;
 public MyEnumerator(Phone[] t)
 {
  p = t;
 }
 public object Current
 {
  get
  {
  if (idx == -1)
   return new IndexOutOfRangeException();
  return p[idx];
  }
 }
 public bool MoveNext()
 {
  idx++;
  return p.Length > idx;
 }
 public void Reset()
 {
  idx = -1;
 }
}
class Program
 {
 static void Main(string[] args)
 {
       show("-----------IEnumerator------------");
  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };
  MyEnumerator enumerator = new MyEnumerator(phones);
  while (enumerator.MoveNext())
  {
  Phone p = enumerator.Current as Phone;
  show(p.Name);
  }
  Console.ReadKey();
 }
 static void show(string i)
 {
  Console.WriteLine(i);
 }
 }

結(jié)果顯示:

果然不出所料,真正做事情的是IEnumerator接口,即可循環(huán)訪問自定義的一個容器,不過,初衷是想用Foreach來做循環(huán)訪問、遍歷的。那好,那就只能顯示IEnumerable接口來做。稍稍改造一下Phone類:

public class Phone : IEnumerable
 {
 public string Name ;
 public Phone(string name)
 {
  this.Name = name;
 }
 Phone[] p;
 public Phone(Phone[] t)
 {
  p = t;
 }
 public IEnumerator GetEnumerator()
 {
  return new MyEnumerator(p);
 }
 }
static void Main(string[] args)
 {
  show("-----------IEnumerator------------");
  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };
  MyEnumerator enumerator = new MyEnumerator(phones);
  while (enumerator.MoveNext())
  {
  Phone p = enumerator.Current as Phone;
  show(p.Name);
  }
  show("-----------IEnumerable------------");
  Phone phoneList = new Phone(phones);
  foreach (Phone p in phoneList)
  {
  show(p.Name);
  }
  Console.ReadKey();
 }

結(jié)果顯示:

大功告成,再擴(kuò)展成通用的容器PhonePackage,繼承泛型IEnumerable<T>接口即可。

public class PhonePackage<T> : IEnumerable<T> 
 {
 private List<T> dataList = null;
 public void Add(T t)
 {
  if (dataList == null)
  dataList = new List<T>();
  dataList.Add(t);
 }
 public IEnumerator<T> GetEnumerator()
 {
  foreach (T t in dataList)
  {
  yield return t;
  }
 }
 IEnumerator IEnumerable.GetEnumerator()
 {
  foreach (T t in dataList)
  {
  yield return t;
  }
 }
 }
static void Main(string[] args)
 {
  show("-----------IEnumerator------------");
  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };
  MyEnumerator enumerator = new MyEnumerator(phones);
  while (enumerator.MoveNext())
  {
  Phone p = enumerator.Current as Phone;
  show(p.Name);
  }
  show("-----------IEnumerable------------");
  Phone phoneList = new Phone(phones);
  foreach (Phone p in phoneList)
  {
  show(p.Name);
  }
  show("-----------IEnumerable<T>------------");
  PhonePackage<Phone> phonePackage = new PhonePackage<Phone>();
  phonePackage.Add(new Phone("iPhone 7s"));
  phonePackage.Add(new Phone("iPhone 6s"));
  phonePackage.Add(new Phone("iPhone 5s"));
  foreach (Phone p in phonePackage)
  {
  show(p.Name);
  }
  Console.ReadKey();
 }
 static void show(string i)
 {
  Console.WriteLine(i);
 }

結(jié)果顯示:

IEnumerator迭代器接口挺啰嗦的,yield是簡化了遍歷的語法糖而已。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • C#開發(fā)中經(jīng)常用的加密解密方法示例

    C#開發(fā)中經(jīng)常用的加密解密方法示例

    這篇文章主要給大家介紹了關(guān)于C#開發(fā)中經(jīng)常用的加密解密方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • unity實現(xiàn)翻頁效果

    unity實現(xiàn)翻頁效果

    這篇文章主要為大家詳細(xì)介紹了unity實現(xiàn)翻頁效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C#四種計時器Timer的區(qū)別和用法

    C#四種計時器Timer的區(qū)別和用法

    這篇文章介紹了C#四種計時器Timer的區(qū)別和用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#的字符串比較

    C#的字符串比較

    這篇文章主要介紹了c# 字符串操作的相關(guān)知識,文中講解的非常詳細(xì),代碼幫助大家更好的學(xué)習(xí),感興趣的朋友可以參考下,希望能給你帶來幫助
    2021-07-07
  • C#用websocket實現(xiàn)簡易聊天功能(服務(wù)端)

    C#用websocket實現(xiàn)簡易聊天功能(服務(wù)端)

    這篇文章主要為大家詳細(xì)介紹了C#用websocket實現(xiàn)簡易聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解C#中Helper類的使用

    詳解C#中Helper類的使用

    項目中用戶頻繁訪問數(shù)據(jù)庫會導(dǎo)致程序的卡頓,甚至堵塞。使用緩存可以有效的降低用戶訪問數(shù)據(jù)庫的頻次,有效的減少并發(fā)的壓力。而helper類對緩存有了封裝,本文展示了封裝的示例代碼,需要的可以參考一下
    2022-04-04
  • 詳解三種C#實現(xiàn)數(shù)組反轉(zhuǎn)方式

    詳解三種C#實現(xiàn)數(shù)組反轉(zhuǎn)方式

    本篇文章主要介紹了詳解三種C#實現(xiàn)數(shù)組反轉(zhuǎn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • C# 擴(kuò)展方法詳解

    C# 擴(kuò)展方法詳解

    這篇文章主要介紹了C# 中的擴(kuò)展方法的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • C#實現(xiàn)txt定位指定行完整實例

    C#實現(xiàn)txt定位指定行完整實例

    這篇文章主要介紹了C#實現(xiàn)txt定位指定行的方法,涉及C#針對文本文件進(jìn)行光標(biāo)定位的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#將異步改成同步方法示例

    C#將異步改成同步方法示例

    這篇文章主要為大家介紹了C#將異步改成同步方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01

最新評論

德惠市| 上林县| 沛县| 泰宁县| 丰都县| 华池县| 昭觉县| 陈巴尔虎旗| 洪湖市| 平阴县| 班戈县| 临漳县| 南和县| 承德市| 大埔县| 阳西县| 开远市| 盈江县| 柘城县| 驻马店市| 集安市| 曲水县| 电白县| 黄石市| 淳安县| 大关县| 安吉县| 新营市| 永春县| 武穴市| 利川市| 城口县| 广安市| 大关县| 宜章县| 江阴市| 上饶县| 长沙市| 综艺| 潜山县| 调兵山市|