问: 集合很好用,而且非常简单,但是我不明白 为什么数组、ArrayList 和 Hasttable 这些集合都能用foreach直接遍历呢?我想自己定义一个集合类,应该怎么做呢?
回答:这个问题问的好,如果查看ArrayList和Hasttable定义可以看到 ,她们都实现了
和
接口,这就是能用foreach的关键所在。
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143602781-982977339.png)
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143604251-637143443.png)
看一下数组的遍历:
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143612405-97691603.png)
那么如果我们自定义的类,能不能也像对数组一样进行遍历呢?
我们先试一下:
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143617830-659260890.png)
运行结果出现错误:
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143638771-666244901.png)
遍历原理:要想使用foreach对自定义的集合类进行遍历,需要实现IEnmuerable接口。
(1)因为IEnmuerable接口有一个返回循环访问集合的枚举器IEnumerator
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143647247-1082452323.png)
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143653157-1146297778.png)
(2)枚举器IEnumerator接口
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143658132-1677128323.png)
使用foreach时,枚举器IEnumerator会编译成如下代码,实现了查找数据功能(对外界是foreach语法)
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143703403-611805948.png)
具体实现方案:
(1)在DepartMent类添加
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143716058-1146296667.png)
然后让该类继承IEnumerator接口
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143720342-793188894.png)
(2)将光标定在
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143724802-79911166.png)
上,然后按alt +shift+F10,选择
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143731691-1278916813.png)
选择第一项
(3)会出现这个
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143743423-1711188744.png)
(4)改成这样
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143747861-1104221277.png)
(5)这样就能用foreach遍历类了。
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143751789-612427951.png)
下面再看一下System.Colliction命名空间下的另一接口:ICollection 。他继承自IEnumerable。
![](https://img2018.cnblogs.com/blog/383345/201907/383345-20190723143757053-823169392.png)