信息发布软件,b2b软件,广告发布软件
标题: VB.NET实现IEnumerator接口实例教程 [打印本页]
作者: 信息发布软件 时间: 2017-1-20 15:32
标题: VB.NET实现IEnumerator接口实例教程
VB.NET经过长时间的发展,很多用户都很了解VB.NET实现IEnumerator接口了,这里我发表一下个人理解,和大家讨论讨论。在面向对象的设计中,经常会用到有类似父子关系的这个对象,比如在我现在的一个项目中,有订单对象,在一个订单下又包含多个产品,这时我就想用 Iterator模式来封装订单下的产品,在dot Net中的IEnumerator接口就是用来实现迭代的,来支持dot Net中的for each的操作。
要VB.NET实现IEnumerator接口,需在实现以下几个函数来支持IEnumerator接口的操作
Overridable ReadOnly Property Current() As Object
Current用于在迭代过程中得到当前的对象
Public Overridable Function MoveNext() As Boolean
MoveNext用于在迭代过程中将迭代指针指向下一个对象,初始是迭代指针指向集合的开始(在第一个节点之前的位置),一旦越过集合的结尾,在调用 Reset 之前,对 MoveNext 的后续调用返回 false。
Overridable Sub Reset()
将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
只要集合保持不变,枚举数就将保持有效。如果对集合进行了更改(例如添加、修改或删除元素),则该枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发InvalidOperationException。
下需是一个具体的VB.NET实现IEnumerator接口的对像
Imports System.Collections
'在此实际实现的是System.Collections.IEnumerable接口,
IteratorProduct 用此接口来向使用者提供对IEnumerator接口的操作。
Public Class IteratorProduct : Implements System.Collections.IEnumerable
Private Products As Collection '用Collection在存订单中的所有产品
Private item As Integer = -1
Public Sub New()
Products = New Collection
Products.Add("xh") '这只是为了测试方便,将加入产品的内容直接写在这了
Products.Add("lj")
Products.Add("qd")
End Sub
Overridable ReadOnly Property Current() As Object
Get
Return Products(item)
End Get
End Property
Public Overridable Function MoveNext() As Boolean
item += 1
End Function
Overridable Sub Reset()
item = -1
End Sub
'返回迭代对像给使用者
Overridable Function GetEnumerator()
As IEnumerator Implements IEnumerable.GetEnumerator
Return Me.Products.GetEnumerator
End Function
End Class
作者: 信息发布软件 时间: 2017-1-20 15:32
在C#中凡是实现了IEnumerator接口的数据类型都可以用foreach语句进行迭代访问.可是自定义类型如何实现IEnumerator接口来支持foreach迭代呢?
要实现这个功能,先来看看IEnumerable和IEnumerator接口的定义.
public interface IEnumerable
{
//IEnumerable只有一个方法,返回可循环访问集合的枚举数.
IEnumerator GetEnumerator();
}
public interface IEnumerator
{
//移动到集合的下一个元素,如果成功返回true,如果失败返回false
bool MoveNext();
//将集合重置为初始位置,这个位置在集合第一个元素之前(类似于-1的状态)
void Reset();
//属性,访问集合的当前元素
object Current{get;}
}
IEnumerator是所有枚举数的基接口.枚举数只允许读取集合中的数据(是只读的,在遍历过程中不可进行修改).枚举数无法用于修改基础集合.最初,枚举数被定位于集合第一个元素的前面.Reset()也将枚举数设置到此位置.在此位置调用Current会引发异常.因此在调用Current之前,必须先调用MoveNext(),将枚举数提前到集合第一个元素,在调用MoveNext和Reset这前,Current会返回同一个对象,MoveNext将Current设置为下一个元素,当使用MoveNext到集合的末尾时,枚举数会被设置到集合最后一个元素的后面.,这时调用MoveNext会返回false.如果调用MoveNext返回false,此时再调用Current会引发一个异常.如果要再次让Current访问集合的第一个元素,应先调用Reset然后再调用MoveNext;
注:实现上是把位于集合首部和尾部的特殊判断转移到了MoveNext函数中.这样我们在使用IEnumerator这个接口会,具体的实现会很漂亮,省事.
枚举数没有对集合的独占访问权,因此枚举一个集合在本质上不是一个线程安全的过程.在枚举一个集合的过程中,其它线程仍可以修改该集合.这会导致枚举数引发异常.如果要在枚举过程中保证线程安全,可以在整个枚举过程事锁定集合,或者捕捉由于其他纯种进行的更改而引发的异常.
下面来总结一下IEnumerable和IEnumerator的区别
1.一个集合要想通过foreach进行迭代就必须实现IEnumearble接口(必须以某种方式返回一个IEnumerator对象)
2.IEnumerator对象具体来实现了一个迭代器
3.从这两个接口的用词选择上可以看出:IEnumerable是一个声明式接口,声明实现该接口的类是可以枚举的,但没有说明如何实现枚举器.
IEnumerator是一个实现式接口,IEnumerator对象就是一个迭代器.
4.IEnumerable和IEnumerator接口通过IEnumerable接口的GetEnumerator方法建立连接,客户可以通过IEnumerable接口的GetEnumerator方法来得到一个IEnumerator对象
在这个意思上可以将GetEnumerator方法看成是IEnumerator的工厂方法.
[csharp] view plain copy
- public class Person
- {
- public string Name { get; set; }
- public string Sex { get; set; }
- }
- //枚举器的实现
- class PersonEnumerator:IEnumerator<Person>
- {
- int _currentIndex;
- Person[] _psersons;
- public PersonEnumerator(Person[] _psersons)
- {
- this._psersons = _psersons;
- _currentIndex = -1;
- }
- public Person Current
- {
- get
- {
- if (_currentIndex < 0 || _currentIndex > _psersons.Length)
- {
- throw new InvalidOperationException("索引越界");
- }
- return _psersons[_currentIndex];
- }
- }
- object System.Collections.IEnumerator.Current
- {
- get
- {
- if (_currentIndex < 0 || _currentIndex > _psersons.Length)
- {
- throw new InvalidOperationException("索引越界");
- }
- return _psersons[_currentIndex];
- }
- }
- public bool MoveNext()
- {
- _currentIndex++;
- return _currentIndex < _psersons.Length;
- }
- public void Reset()
- {
- _currentIndex = -1;
- }
- public void Dispose()
- {
- }
- }
- public class Persons : IEnumerable<Person>
- {
- Person[] _persons;
- public Persons()
- {
- _persons = new Person[]
- {
- new Person
- {
- Name = "1",
- Sex="---",
- },
- new Person
- {
- Name = "2",
- Sex="---",
- },
- };
- }
- public IEnumerator<Person> GetEnumerator()
- {
- return new PersonEnumerator(_persons);
- }
- System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
- {
- return new PersonEnumerator(_persons);
- }
- }
作者: 信息发布软件 时间: 2017-1-20 15:35
在C#中凡是实现了IEnumerator接口的数据类型都可以用foreach语句进行迭代访问.可是自定义类型如何实现IEnumerator接口来支持foreach迭代呢?
要实现这个功能,先来看看IEnumerable和IEnumerator接口的定义.
public interface IEnumerable
{
//IEnumerable只有一个方法,返回可循环访问集合的枚举数.
IEnumerator GetEnumerator();
}
public interface IEnumerator
{
//移动到集合的下一个元素,如果成功返回true,如果失败返回false
bool MoveNext();
//将集合重置为初始位置,这个位置在集合第一个元素之前(类似于-1的状态)
void Reset();
//属性,访问集合的当前元素
object Current{get;}
}
IEnumerator是所有枚举数的基接口.枚举数只允许读取集合中的数据(是只读的,在遍历过程中不可进行修改).枚举数无法用于修改基础集合.最初,枚举数被定位于集合第一个元素的前面.Reset()也将枚举数设置到此位置.在此位置调用Current会引发异常.因此在调用Current之前,必须先调用MoveNext(),将枚举数提前到集合第一个元素,在调用MoveNext和Reset这前,Current会返回同一个对象,MoveNext将Current设置为下一个元素,当使用MoveNext到集合的末尾时,枚举数会被设置到集合最后一个元素的后面.,这时调用MoveNext会返回false.如果调用MoveNext返回false,此时再调用Current会引发一个异常.如果要再次让Current访问集合的第一个元素,应先调用Reset然后再调用MoveNext;
注:实现上是把位于集合首部和尾部的特殊判断转移到了MoveNext函数中.这样我们在使用IEnumerator这个接口会,具体的实现会很漂亮,省事.
枚举数没有对集合的独占访问权,因此枚举一个集合在本质上不是一个线程安全的过程.在枚举一个集合的过程中,其它线程仍可以修改该集合.这会导致枚举数引发异常.如果要在枚举过程中保证线程安全,可以在整个枚举过程事锁定集合,或者捕捉由于其他纯种进行的更改而引发的异常.
下面来总结一下IEnumerable和IEnumerator的区别
1.一个集合要想通过foreach进行迭代就必须实现IEnumearble接口(必须以某种方式返回一个IEnumerator对象)
2.IEnumerator对象具体来实现了一个迭代器
3.从这两个接口的用词选择上可以看出:IEnumerable是一个声明式接口,声明实现该接口的类是可以枚举的,但没有说明如何实现枚举器.
IEnumerator是一个实现式接口,IEnumerator对象就是一个迭代器.
4.IEnumerable和IEnumerator接口通过IEnumerable接口的GetEnumerator方法建立连接,客户可以通过IEnumerable接口的GetEnumerator方法来得到一个IEnumerator对象
在这个意思上可以将GetEnumerator方法看成是IEnumerator的工厂方法.
[csharp] view plain copy
- public class Person
- {
- public string Name { get; set; }
- public string Sex { get; set; }
- }
- //枚举器的实现
- class PersonEnumerator:IEnumerator<Person>
- {
- int _currentIndex;
- Person[] _psersons;
-
- public PersonEnumerator(Person[] _psersons)
- {
- this._psersons = _psersons;
- _currentIndex = -1;
- }
- public Person Current
- {
- get
- {
- if (_currentIndex < 0 || _currentIndex > _psersons.Length)
- {
- throw new InvalidOperationException("索引越界");
- }
- return _psersons[_currentIndex];
- }
- }
-
- object System.Collections.IEnumerator.Current
- {
- get
- {
- if (_currentIndex < 0 || _currentIndex > _psersons.Length)
- {
- throw new InvalidOperationException("索引越界");
- }
- return _psersons[_currentIndex];
- }
- }
-
- public bool MoveNext()
- {
- _currentIndex++;
- return _currentIndex < _psersons.Length;
- }
-
- public void Reset()
- {
- _currentIndex = -1;
- }
-
- public void Dispose()
- {
-
- }
- }
- public class Persons : IEnumerable<Person>
- {
- Person[] _persons;
- public Persons()
- {
- _persons = new Person[]
- {
- new Person
- {
- Name = "1",
- Sex="---",
-
- },
- new Person
- {
- Name = "2",
- Sex="---",
-
- },
- };
- }
- public IEnumerator<Person> GetEnumerator()
- {
- return new PersonEnumerator(_persons);
- }
-
- System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
- {
- return new PersonEnumerator(_persons);
- }
- }
作者: 紫逸风 时间: 2017-1-21 02:22
收到了,安装上了,特别好用,速度很快,商家的售后做的很到位,耐心的讲解,热情的招待,技术方面很专业.
作者: 西充 时间: 2017-1-21 13:46
超值的东西
作者: 万能群发 时间: 2017-1-21 15:37
的很漂亮,我很满意。
作者: mmgg520 时间: 2017-1-21 16:36
意思,出差一直没顾上。微信平台开发找你们做绝对是正确的选择。服务是值得肯定的,售后也非常到位,技术支持很强大,重点是热心.不厌其烦。不像有些玩技术的那个清高啊,那个沟通难度啊真不是一般的高。
作者: brt02 时间: 2017-1-21 17:49
大气漂亮,全5星好评,已经合作好几次了,非常不错.
作者: meng00123 时间: 2017-1-22 10:40
制作速度很快
作者: znl001 时间: 2017-1-22 13:30
衍了事的嫌疑
作者: daoke 时间: 2017-1-22 19:56
次再来、
作者: beiao 时间: 2017-1-22 23:50
啊服务和售后没得说耐心解决问题
作者: asz111 时间: 2017-1-24 13:59
很精美,多样化,店家服务态度很好,满意!
作者: 123 时间: 2017-1-24 18:22
贝不错。店家服务态度很好。
作者: chenxue2015 时间: 2017-1-25 03:05
和5号笨蛋
作者: ctbvip 时间: 2017-1-25 16:01
好,与卖家描述的完全一致,非常满意
作者: anleey 时间: 2017-1-25 20:51
很精致,售后服务态度也很好,非常满意
作者: c19900420 时间: 2017-1-26 00:54
,服务态度很好,技术水平高,赞一个,强烈推荐!
作者: senbza 时间: 2017-1-26 03:52
的资料,谢谢店主
作者: xoxo110 时间: 2017-1-26 16:04
谢卖家。三两下就解决了问题
作者: huaxue98 时间: 2017-1-29 19:56
力.服务很到位!
作者: beiao 时间: 2017-1-29 22:17
,一般般
作者: meilifc001 时间: 2017-1-29 23:37
很好,大爱。
作者: 乱世扶稣 时间: 2017-1-30 06:28
晒下,也算打个广告好了
作者: 阿拉丁 时间: 2017-1-30 09:29
欢迎前来参观本店百德家具广场
作者: shenyeben 时间: 2017-1-30 18:31
务很好,设计的宝贝很漂亮我很满意,以后有需要还会合作
作者: 万能群发 时间: 2017-1-30 18:47
和077组合服务非常好
作者: tian001 时间: 2017-1-31 13:57
来的,挺满意的,客服也比较也耐心~回头会介绍人过来的
作者: xiaoyaoyao001 时间: 2017-1-31 15:05
这次合作,整个过程很顺利,今后我的店铺还是会请你帮我装修,希望越来越好
作者: aluoting 时间: 2017-1-31 15:25
说。。。
作者: tian001 时间: 2017-2-1 13:00
作的卖家,就是感觉挺伟大,还有很多的需要麻烦客服,总体感觉很不错~~
作者: jiandao1 时间: 2017-2-2 10:44
意速度很快有机会我还会再来的呵呵合作愉快哦!
作者: cjagl520 时间: 2017-2-2 11:04
学习了省去了很多功夫
作者: 大宝罗滴滴 时间: 2017-2-2 11:54
推荐的店铺,客服超级nice,远程装修,全5分,棒棒滴!
作者: ye112219 时间: 2017-2-2 14:20
需要專家的協助,自已弄真的是一整個悲劇,搞不懂要怎麼弄到好,很怕買了結果還是搞不出來!
作者: 429187535 时间: 2017-2-2 16:18
很好,服务也好,耐心细致,下次还会来的
作者: jh134724 时间: 2017-2-3 04:06
帮你顶下哈!!
作者: anleey 时间: 2017-2-3 07:07
确认晚了,一直在忙着建设,客服和技术,包括帮我搭建的人都非常棒,非常耐心,以后肯定还会有很多问题,希望能再帮我解决,后台速度很快,第三方后台这家是让我满意的。
作者: 紫逸风 时间: 2017-2-3 16:55
合作了。
作者: meng00123 时间: 2017-2-4 03:44
的不错,顶顶好买家!
作者: 小白 时间: 2017-2-5 15:37
不错,以后有需要还会来的,服务挺好的。对小白来说很好1
作者: xiaozhu168 时间: 2017-2-5 18:49
值,值得一买,不错不错不错!!!
作者: iiiiik 时间: 2017-2-5 23:13
力,好评!!!!
作者: 阿拉丁 时间: 2017-2-6 09:45
计的不错。
作者: 武器 时间: 2017-2-6 12:33
态度很好,特别是帮我做网页的技术小哥,工号是07.很认真,加班都帮我改。谢谢他了。售后服务也好,不懂的,直接QQ一呼叫,立马回复。谢啦,07号小帅锅
作者: x201323 时间: 2017-2-6 16:23
店家服务真的很好!
作者: xiaozhu168 时间: 2017-2-6 23:23
源,很值哦
作者: xoxo110 时间: 2017-2-7 05:36
很好,服务很好,耐心细致,下次还会来的
作者: niubttt 时间: 2017-2-7 10:36
很快,价位也很合理,好评
作者: q1598188 时间: 2017-2-7 12:04
沟通问题已经解决,客服晨曦服务态度比较好。就是线上沟通,有些困难。希望可以尽快完善。合作愉快
作者: meng00123 时间: 2017-2-7 12:21
特意用了几天才来追加评论的,真心好用,大爱!!!
作者: huaxue98 时间: 2017-2-7 15:08
老板人非常好
作者: 123 时间: 2017-2-7 16:45
写的真的很不错
作者: ctbvip 时间: 2017-2-7 22:00
不太了解的我,抱着试试的态度开始了第一次的合作,没有想到效果非常不错,在沟通的过程中,我也学会了很多装修知
作者: a001hao 时间: 2017-2-8 06:55
业,好评!!!!
作者: a001hao 时间: 2017-2-9 05:19
,而且服务很好。值得信赖。
作者: 429187535 时间: 2017-2-9 11:06
了好久,让老板分分钟搞定,挺好的,加赞!
作者: meng00123 时间: 2017-2-9 17:26
计的不错。
作者: linshihu 时间: 2017-2-9 19:34
服务那是相当的好啊太好了的如果客服是女的我准备取她做媳妇的
作者: beiao 时间: 2017-2-10 02:33
人,解决问题超负责的!点32个赞
作者: feiyang2006 时间: 2017-2-10 10:07
沟通问题已经解决,客服晨曦服务态度比较好。就是线上沟通,有些困难。希望可以尽快完善。合作愉快
作者: xubaojin 时间: 2017-2-10 15:09
业,好评!!!!非常值得信任!!
作者: loverun 时间: 2017-2-10 16:00
,值得长期合作!
作者: 小白 时间: 2017-2-11 02:53
点晚,技术很不错,完全根据我的需求改的。而且额外帮了我和教了我很多东西,下次如果改论坛一定再来找你!做出来的板块真的很不错。
作者: feiyang2006 时间: 2017-2-11 15:56
写的真的很不错
作者: xiaoyaoyao001 时间: 2017-2-11 20:37
等好礼
作者: ye112219 时间: 2017-2-12 05:36
全了
作者: c19900420 时间: 2017-2-13 06:30
服务态度相当的好,后台好多不明白的地方都会解答,实在搞不明白的会帮我们搞定,很不错卖家。
作者: 694012770 时间: 2017-2-13 08:02
家,没一家利索的,虽然是一个小问题,但是困扰我很久,这个卖家分分钟给我搞完,给力不解释。
作者: q1598188 时间: 2017-2-13 09:21
态度不错。
作者: 西充 时间: 2017-2-13 13:39
的服务做的非常到位!!很感谢!
作者: cd0010 时间: 2017-2-14 00:55
好人品,生意兴隆,都是5分
作者: anleeycn 时间: 2017-2-14 00:59
业,开发团队的信誉果然,好评
作者: dfgdgdfgdf 时间: 2017-2-14 01:12
和5号笨蛋很有耐心,服务也很好
作者: daoke 时间: 2017-2-14 01:16
学习了,不错,讲的太有道理了
作者: niubttt 时间: 2017-2-14 01:19
很好,很不错!
作者: anleey 时间: 2017-2-14 01:20
好,技术和服务都很好,比我想象中的好,技术也很负责到位,节假日也没有休息。辛苦了
作者: ggt567 时间: 2017-2-14 01:24
量很好物流很快跟卖家描述是一样的很满意
作者: 阿拉丁 时间: 2017-2-14 02:05
笨蛋,1号,19号,7号,077号,5号解决问题好
作者: meili1 时间: 2017-2-14 02:20
,功能齐全,不懂的地方反复讲解,服务态度可以,赞一个。
作者: ebxly 时间: 2017-2-14 06:33
。服务非常好。
作者: brt02 时间: 2017-2-14 12:59
发货了,内容挺丰富,挺齐全,好评!
作者: ekmci 时间: 2017-2-14 13:53
店家非常热情不懂的耐心解答好非常满意~
作者: xiaozhu168 时间: 2017-2-14 15:15
及时做出评价,系统默认好评!
作者: niyaoz1 时间: 2017-2-14 17:41
用心设计。。
作者: mmgg520 时间: 2017-2-15 01:34
意,做了好几个店铺了,服务真心的不错,客服真的很热情,装修以后就是你家了!
作者: wbd902 时间: 2017-2-15 03:56
是比较划算的,自己比较轻松
作者: huangge 时间: 2017-2-15 05:19
不错不错,您辛苦了。。。
作者: 西充 时间: 2017-2-15 08:48
,,价格又便宜。。
作者: lalajie 时间: 2017-2-15 09:12
相当不错,感谢无私分享精神!
作者: yerface 时间: 2017-2-15 13:03
强大,效果不错,信息非常强大,非常适合微商平台。客服人员很有耐心,老板非常诚信。值得分享!!!
作者: meili1 时间: 2017-2-15 14:53
号和077号技术组合,很耐心的帮我改网站,目前网站比较满意,后期有问题还要麻烦他们继续帮我改,下次有需要还会找这家
作者: wbd902 时间: 2017-2-15 15:29
装修,没想到留着第一次买的这么舒心和放心。店长人超好的,有一次我咨询他他有事没在。还特意打电话给我。这么有心的店长太棒了。N个赞??????……必须好评
作者: brt02 时间: 2017-2-15 16:09
码,卖家发货也很快,5分好评!
作者: mm5216299 时间: 2017-2-15 16:28
啊服务和售后没得说耐心解决问题
作者: 694012770 时间: 2017-2-15 20:01
制作速度很快
作者: wbd902 时间: 2017-2-15 20:22
能用...算了好评吧
作者: ufo50200 时间: 2017-2-17 17:15
计的非常棒。。。服务态度很好。。。。非常满意,值得购买。
作者: meili1 时间: 2017-2-17 17:21
速度快
作者: mmgg 时间: 2017-2-18 17:20
服太好了,什么都好!非常满意!
欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) |
Powered by Discuz! X3.2 |