博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# IEnumerable和IEnumerator的区别,如何实现
阅读量:7091 次
发布时间:2019-06-28

本文共 1373 字,大约阅读时间需要 4 分钟。

IEnumerable接口和IEnumerator接口是.NET中非常重要的接口,二者有何区别?

    1. 简单来说IEnumerable是一个声明式的接口,声明实现该接口的类就是“可迭代的enumerable”,但并没用说明如何实现迭代器(iterator).其代码实现为:

         public interface IEnumerable

         {
                IEnumerator GetEnumerator();
          }
    2. 而IEnumerator接口是实现式接口,它声明实现该接口的类就可以作为一个迭代器iterator.其代码实现为:

        public interface IEnumerator

       {
                object Current { get; }

                bool MoveNext();

                void Reset();
        }

   3.一个collection要支持Foreach进行遍历,就必须实现IEnumerable,并一某种方式返回迭代器对象:IEnumerator.

   那么又如何实现这两个接口呢? 其代码如下:

  假设有一个Person类,其有两个属性FirstName和LastName

  public class Person

    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Person(string firstName, string lastName)
        {
            this.FirstName = firstName;
            this.LastName = lastName;
        }
    }

另外通过People类来实现IEnumerable和IEnumerator接口.

//实现IEnumerable接口

public class People :IEnumerable

{

   public Person [] pers;

   public People(Person [] ps)

    {

      this.pers = ps;

    }

    public IEnumerator GetEnumerator()

    {

         //foreach(Person p in pers)

         // {

             //  yield return p;

          // }

      return new People1(pers);

      }

}

  //实现IEnumerator接口

   public class People1 : IEnumerator

    {
        public Person[] pers;
        public People1(Person[] per)
        {
            this.pers = per;
        }
        int position = -1;

        public bool MoveNext()

        {
            position++;
            return position < pers.Length;
        }
        public void Reset()
        {
            position=-1;
        }
        public object Current
        {
            get
            {
               try
               {
                   return pers[position];
               }
                catch(IndexOutOfRangeException ex)
                {
                    throw new InvalidOperationException();
                }
            }
        }
    }

转载地址:http://aziql.baihongyu.com/

你可能感兴趣的文章
分析Linux内核创建一个新进程的过程【转】
查看>>
Web API应用架构设计分析(2)
查看>>
.NET插件系统之二——不实例化获取插件信息和可视化方法
查看>>
让asp.net默认的上传组件支持进度条反映
查看>>
EXTJS学习系列提高篇:第十一篇(转载)作者殷良胜,制作树形菜单之五
查看>>
从代码分析Android-Universal-Image-Loader的图片加载、显示流程
查看>>
阿里妈妈首次公开新一代自研智能检索模型 | WWW 2018论文解读
查看>>
使用Depth Texture
查看>>
第 9 章 PBX
查看>>
ylbtech-LanguageSamples-Porperties(属性)
查看>>
第 4 章 Music score
查看>>
架构设计目录
查看>>
Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
查看>>
学习笔记: CSS3 鼠标悬停动画
查看>>
ylbtech-cnblogs(博客园)-数据库设计-7,News(新闻)
查看>>
WCF 基础简介
查看>>
用Soap消息调用Web Services(续)
查看>>
php数据库操作封装类
查看>>
atitit.导出excel的设计----查询结果 导出为excel的实现java .net php 总结
查看>>
[LeetCode] Partition List 划分链表
查看>>