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

C# IEnumerable和IEnumerator接口淺析

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

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

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

IEnumerable接口

public interface IEnumerable
{ 
 IEnumerator GetEnumerator();
}

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

IEnumerator接口

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

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

定義一個(gè)Phone類(lèi)

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

定義一個(gè)名為MyEnumerator迭代器,并現(xiàn)實(shí)它接口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)訪問(wèn)自定義的一個(gè)容器,不過(guò),初衷是想用Foreach來(lái)做循環(huán)訪問(wèn)、遍歷的。那好,那就只能顯示IEnumerable接口來(lái)做。稍稍改造一下Phone類(lèi):

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是簡(jiǎn)化了遍歷的語(yǔ)法糖而已。

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

相關(guān)文章

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

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

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

    unity實(shí)現(xiàn)翻頁(yè)效果

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

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

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

    C#的字符串比較

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

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

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

    詳解C#中Helper類(lèi)的使用

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

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

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

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

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

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

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

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

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

最新評(píng)論

杭锦旗| 米易县| 民和| 抚顺市| 台北县| 高雄县| 达州市| 湟源县| 扶风县| 那坡县| 湘潭县| 射洪县| 汨罗市| 称多县| 永济市| 泽州县| 页游| 昌平区| 文化| 泽州县| 商洛市| 吉水县| 徐州市| 昔阳县| 舟山市| 榆林市| 韶山市| 绵阳市| 德江县| 武乡县| 博白县| 临漳县| 康平县| 原阳县| 绥宁县| 马边| 神农架林区| 浮山县| 滦平县| 米易县| 双峰县|