面向对象——迭代器

简介: 面向对象——迭代器

迭代器是方法、get访问器或运算符,使得开发人员能够在类或结构中支持foreach迭代,而不必实现整个IEnumerable接口。只需提供一个迭代器,即可遍历类中的数据结构。当编辑器检测到迭代器时,他将自动生成IEnumerable或IEnumerable接口的Current、MoveNext和Dispose方法。迭代器的特点:


 迭代器可用方法、运算符或get访问器的代码体。


 迭代器使用yield return语句一次返回每个元素,yield break 将终止迭代。


 迭代器是可以返回相同类型的值的有序序列的一段代码


 迭代器的返回类型必须是IEnumerable和IEnumerator中的任意一种。


例:创建迭代器


namespace JieKou


{

   class StudentList


   {

       string student1 = "甲";


       string student2 = "乙";


       string student3 = "丙";


       string student4 = "丁";


       string student5 = "戊";


       public String Student1 { get { return student1; } set { student1 = value; } }


        public String Student2 { get { return student2; } set { student2 = value; } }


        public String Student3 { get { return student3; } set { student3 = value; } }


        public String Student4 { get { return student4; } set { student4 = value; } }


        public String Student5{ get { return student5; } set { student5 = value; } }


       public System.Collections.IEnumerator GetEnumerator()


       {

           for (int i = 0; i < 5; i++)


           {

               switch (i)


               {

                   case 0:


                       yield return Student1;


                       break;


                   case 1:


                       yield return Student2;


                       break;


                   case 2:


                       yield return Student3;


                       break;


                   case 3:


                       yield return Student4;


                       break;


                   case 4:


                       yield return Student5;


                       break;


               }


           }


       }


   }


   class Program


   {

       static void Main(string[] args)


       {

           StudentList myStudent = new StudentList();


           foreach (var student in myStudent)


           {

               Console.WriteLine(student.ToString());


           }


       }


   }


}


输出结果:








可以看到程序中为StudentList类实现了一个迭代器,并且通过迭代器获得相应的字段值。类的这种结构是比较合理的。当既需要通过遍历的方法获得对象中的全部内容,又需要单个地获得其属性的时候应当使程序实现迭代器以及相应的属性。这样的代码便于使用。


例:迭代器通过IEnumerator接口实现GetEnumerator方法创建迭代器


string[] myFamily = { "父亲", "母亲", "弟弟", "妹妹" };


       public System.Collections.IEnumerator GetEnumerator()


       {

           for (int i = 0; i < myFamily.Length; i++)


           {

               yield return myFamily[i];


           }


       }


例:使用迭代器显示公交站点


namespace ShowBusStation


{

   public partial class Form1 : Form


   {

       public Form1()


       {

           InitializeComponent();


       }


       public static IList<object> items = new List<object>();//定义一个泛型对象,用于存储对象


       /// <summary>


       /// 通过迭代器获取泛型中的所有对象值


       /// </summary>


       /// <param Node="n">泛型对象</param>


       /// <returns>IEnumerable<object></returns>


       public static IEnumerable<object> GetValues()


       {

           if (items != null)//如果泛型不为空


           {

               foreach (object i in items)//遍历泛型中的对象


                   yield return i;


           }


       }


       private void Form1_Load(object sender, EventArgs e)


       {

//向泛型集合中添加站点数据


        items.Add("长新东路"); items.Add("同康路"); items.Add("农行干校"); items.Add("八里堡"); items.Add("东荣大路");items.Add("二木材");


items.Add("胶合板厂"); items.Add("阜丰路") items.Add("荣光路");


items.Add("东盛路");items.Add("安乐路");items.Add("岭东路");items.Add("公平路");items.Add(108);   items.Add(true);


       }


       private void button1_Click(object sender, EventArgs e)


       {

           foreach (object i in GetValues())//遍历泛型集合


               listView1.Items.Add(i.ToString());//在列表视图中显示公交车站点


       }


       private void button2_Click(object sender, EventArgs e)


       {

           Close();//关闭当前窗体


       }


   }


}


例:使用迭代器实现倒序遍历


namespace ReverseOrder


{

   public partial class Form1 : Form


   {

       public Form1()


       {

           InitializeComponent();


       }


       /// <summary>


       /// 通过迭代器实现字符串的倒序


       /// </summary>


       /// <param string="n">进行倒序的字符串</param>


       /// <returns>以对象的方式倒序返回单个字符</returns>


       public static IEnumerable<object> Transpose(string n)


       {

           if (n.Length >0)//如果泛型不为空


           {

               for (int i = n.Length-1; i >= 0; i--)//从末尾开始遍历字符串


                   yield return (object)n[i];//返回数据集合


           }


       }


       /// <summary>


       /// 获取倒序后的字符串


       /// </summary>


       /// <param string="Str">进行倒序的字符串</param>


       /// <returns>返回倒序后的字符串</returns>


       public string GetValue(string Str)


       {

           if (Str.Length == 0)//判断字符串长度是否为0


               return "";//返回空


           string Tem_Str = "";//记录倒序之后的字符串


           foreach (object i in Transpose(Str))//遍历迭代器


               Tem_Str += i.ToString();//获取迭代器中的每个字符


           return Tem_Str;//返回倒序之后的字符串


       }


       private void button1_Click(object sender, EventArgs e)


       {

           textBox2.Clear();


           textBox2.Text = GetValue(textBox1.Text);


       }


   }


}


目录
相关文章
|
存储 索引
|
7月前
|
存储 安全 Java
java泛型与迭代器的关系
java泛型与迭代器的关系
|
8月前
|
存储 安全 算法
Java泛型与集合:类型安全的集合操作实践
Java泛型与集合:类型安全的集合操作实践
|
8月前
|
存储 编译器 C++
C++:迭代器的封装思想
C++:迭代器的封装思想
46 0
|
存储 算法 编译器
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
|
设计模式 Java
浅析Java设计模式【3.8】——迭代器
Java常用设计模式,迭代器模式
107 0
浅析Java设计模式【3.8】——迭代器
|
Java 数据库连接 uml
迭代器底层原理
深究迭代器底层原理
203 0
面向对象之方法重载
我们今天来学习方法重载,在之前已经学了面向对象 的方法创建,面向对象的编程思想,方法重载的含义就是 在同一个类里可不可以创建多个方法,通过传参的方式进 行调用实现更多的功能,使传回的值可以是其他类型,增 加了方法类的复用性。
181 0
面向对象之方法重载
|
设计模式 算法
设计模式之迭代器
设计模式之迭代器
142 0
设计模式之迭代器
|
设计模式 Java 数据安全/隐私保护
设计模式是什么鬼(迭代器)
设计模式是什么鬼(迭代器)
设计模式是什么鬼(迭代器)