面向对象——迭代器

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

迭代器是方法、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);


       }


   }


}


目录
相关文章
|
存储 索引
|
3月前
|
开发框架 .NET C#
C#语言进阶(四) 枚举器和迭代器
C#语言进阶(四) 枚举器和迭代器
35 0
|
5月前
|
存储 安全 Java
java泛型与迭代器的关系
java泛型与迭代器的关系
|
6月前
|
算法 程序员 C语言
【C++ 迭代器实现细节 】深入探索C++迭代器:从实现到整合
【C++ 迭代器实现细节 】深入探索C++迭代器:从实现到整合
169 0
|
6月前
|
存储 编译器 C++
C++:迭代器的封装思想
C++:迭代器的封装思想
34 0
|
算法 安全 关系型数据库
深入探究C++中的仿函数和迭代器——提升你的STL技能
作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段&gt;——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 作者主页:热爱编程的小K 专栏链接:c++ 欢迎各位→点赞 + 收藏 + 留言​ 总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 ———————————————— 版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_72157449
|
索引 Python 容器
超深入了解掌握迭代器的知识点
超深入了解掌握迭代器的知识点
|
设计模式 Java
浅析Java设计模式【3.8】——迭代器
Java常用设计模式,迭代器模式
101 0
浅析Java设计模式【3.8】——迭代器
|
Java 数据库连接 uml
迭代器底层原理
深究迭代器底层原理
183 0
|
设计模式 算法
设计模式之迭代器
设计模式之迭代器
136 0
设计模式之迭代器
下一篇
无影云桌面