关于迭代器中IEnumerable与IEnumerator的区别
2018-06-18 04:38:15来源:未知 阅读 ()
首先是IEnumerable与IEnumerator的定义:
1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项。
2.IEnumerator接口是一个真正的集合访问器,它包含MoveNext()方法和Current属性,在foreach循环中,如果MoveNext()返回True,则就是用IEnumerator接口的Current属性来获取对象的一个引用,用于foreach循环。
3.如果要迭代一个类,可以使用GetEnumerator(),其返回类型是IEnumerator.
如果要迭代一个类成员,则用IEnumerable.
下面的例子是迭代Person类中的类成员Ages,使用了IEnumerable。第二个例子则是迭代一个类,所以使用了IEnumerator作为返回值。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _10_5_5 { public class person { private string name; private int age; public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public person(string PName, int PAge) { Name = PName; Age = PAge; } public static bool operator >(person a, person b) { if (a.Age > b.Age) return true; else return false; } public static bool operator <(person a, person b) { if (a.Age > b.Age) return false; else return true; } public static bool operator >=(person a, person b) { if (a.Age >= b.Age) { return true; } else return false; } public static bool operator <=(person a, person b) { if (a.Age <= b.Age) return true; else return false; } } public class People : DictionaryBase { public IEnumerable Ages//注意是IEnumerable { get { foreach (object person in Dictionary.Values) { yield return (person as person).Age; } } } public person[] GetOldest() { People oldPeople = new People(); person oldPerson = null; person currentPerson; foreach (DictionaryEntry myPeople in Dictionary) { currentPerson = myPeople.Value as person; if (oldPerson == null) { oldPerson = currentPerson; oldPeople.Add(oldPerson); } else { if (currentPerson > oldPerson) { oldPeople.Clear(); oldPeople.Add(currentPerson); oldPerson = currentPerson; } else { if (currentPerson >= oldPerson) { oldPeople.Add(currentPerson); } } } } person[] oldestPeopleArray = new person[oldPeople.Count]; int copyIndex = 0; foreach (DictionaryEntry p in oldPeople) { oldestPeopleArray[copyIndex] = p.Value as person; copyIndex++; } return oldestPeopleArray; } public void Add(person p) { Dictionary.Add(p.Name, p); } public person this[string SName] { get { return (person)Dictionary[SName]; } set { Dictionary[SName] = value; } } } class Program { static void Main(string[] args) { person a = new person("Jack", 11); person b = new person("Json", 10); People s = new People(); s.Add(a); s.Add(b); foreach(int age in s.Ages) { Console.WriteLine("{0}\t", age); } Console.ReadKey(); } } }
下面是自定义的一个迭代器的例子:
Primer.CS
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ch11Ex03_Exam { public class Primes { private long min; private long max; public Primes():this(2,100) { } public Primes(long minNum,long maxNum) { if(minNum<2) { min=2; }else{ min = minNum; } max = maxNum; } public IEnumerator GetEnumerator()//返回的是IEnumerator { for(long i=min;i<max;i++) { int flag = 1; for(long j=2;j<Math.Sqrt(min);j++) { if(i%j==0) { flag = 0; break; } } if(flag==1) { yield return i; } } } } }
Program.CS:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ch11Ex03_Exam { class Program { static void Main(string[] args) { Primes s = new Primes(2, 100); foreach(long i in s) { Console.WriteLine("{0}\t", i); } Console.ReadKey(); } } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 怎么自学JAVA开发? 2020-05-22
- 关于序列化的 10 几个问题,你顶得住不?.md 2020-05-19
- 从`ArrayList`中了解Java的迭代器 2020-05-17
- 错题记录——关于Java中private的用法(类与封装) 2020-05-16
- 关于Spring源码的面试题,他的回答是我见过最棒的了 2020-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash