zoukankan      html  css  js  c++  java
  • IEnumerable和IEnumerator


    IEnumerable接口只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。IEnumerator对象是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。IEnumerator接口定义了一个Current属性,MoveNext和Reset两个方法,既然IEnumerator对象时一个访问器,那至少应该有一个Current属性,来获取当前集合中的项
    MoveNext方法只是将游标的内部位置向前移动,简单来说就是移到一下个元素而已),要想进行循环遍历,就需要用到这个

    IEnumerator:提供在普通集合中遍历的接口,有Current,MoveNext(),Reset(),其中Current返回的是object类型。

    <1>、在简单的web页面中

    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    test A = new test();
    foreach (Ca c in A)
    {
    Label1.Text = Label1.Text + c.a.ToString() + c.b.ToString();
    }
    }
    //public IEnumerable<int> IEnumerable { get; set; }

    public class test
    {
    Ca[] IEnum = new Ca[4];
    //启动时填充一些Ca对象
    public test()
    {
    //为数组字段赋值
    IEnum[0] = new Ca { a = "a", b = 30 };
    IEnum[1] = new Ca { a = "b", b = 50 };
    IEnum[2] = new Ca { a = "c", b = 30 };
    IEnum[3] = new Ca { a = "d", b = 45 };
    }
    //用接口实现对对象的遍历
    public IEnumerator GetEnumerator() //实现接口
    {
    return this.IEnum.GetEnumerator();
    }
    }
    public class Ca
    {
    public string a { get; set; }
    public int b { get; set; }
    }
    }

    <2>如以上代码没有下面这个实现接口的代码,

    public IEnumerator GetEnumerator() //实现接口
    {
    return this.IEnum.GetEnumerator();

    则会出现:“_Default.test”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“_Default.test”类型的变量的错误,使用IEnumerator是实现当一个对象是集合的时候,循环遍历

    二、然而到这里而IEnumerable和IEnumerator 的有人又会问区别又是什么呢?

    在看IEnumerable这个定义的时候可以看出IEnumerable中包含一个IEnumerator,则总结一下内容:

    IEnumerable<T>:继承自IEnumerable,暴露一个IEnumerator<T>,支持在泛型集合中遍历。

    直接上代码给来看:

    //IEnumerable的使用方法
    IEnumerable<Ca> a { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
    List<Ca> s = new List<Ca>();
    Ca d = new Ca();
    d.a = "1";
    d.b = 2;
    s.Add(d);
    a = s;
    if (a == null) { Label1.Text = "1"; }
    else
    {
    foreach (Ca c in a)
    {
    Label1.Text = Label1.Text + c.a.ToString() + c.b.ToString();
    }
    }
    }
    public class Ca
    {
    public string a { get; set; }
    public int b { get; set; }
    }

    从上面的代码可以看出,IEnumerable可以接受一个泛型集合,且由于暴露一个IEnumerator<T>所以该对象也可以被遍历。

  • 相关阅读:
    学习笔记-php图像等比例剪裁-2016.4.7
    学习日记-2016.3.31
    学习日记--2016.3.30
    I/O扩展篇(基于74HC164/74HC165)
    Visual SVN Server启动失败0x8007042a错误
    CC3000 主机驱动API介绍
    CC3000 SPI接口编程介绍
    struct和typedef struct彻底明白了
    MSP430学习笔记:UART
    DWORD类型的IP地址转换为CString字符串
  • 原文地址:https://www.cnblogs.com/May-day/p/5445524.html
Copyright © 2011-2022 走看看