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>所以该对象也可以被遍历。

  • 相关阅读:
    python使用openpyxl操作execl
    python 修改、读取图片元数据
    python 利用pyttsx3文字转语音(转)
    SQL学习——SELECT INTO和INSERT INTO SELECT
    iOS开发环境搭建 及 编写1个hello world
    xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
    头疼3-4次的问题,数据从DB导出到EXCEL,再从EXCEL导入到DB,数据格式发生错误 ,导致 程序出错。
    安卓自动打包持续集成
    jenkins实现master变化时,才触发构建(过滤分支)
    配置github的pull request触发jenkins自动构建
  • 原文地址:https://www.cnblogs.com/May-day/p/5445524.html
Copyright © 2011-2022 走看看