C#学习小记(1) - 集合接口ICollection,IEnumerable,IEnumerator等的关系
2015-04-08 23:10
435 查看
这是博主看书的暂时的小记,未来有时间会整理成学习资料,目前仅供看着乐
今天看书看到泛型,泛型中用集合接口做了例子,就想顺便理一下集合的各种接口的意思
咱先假定已经知道什么是接口了,啊
注:以下大部分内容,只要在后面加一个< T > ,就可以泛型啦
C#中实现集合有很多办法,比如说数组,比如说ArrayList,比如说List
话说相比之下ArrayList和List比起来似乎一无是处,回头做个比较。
那么这么多办法还有一个就是自建一个集合类,是的,就和List一样,高大上。
那你想做这么个类,为了融入环境,人家List能做的,你也得能做,那就得实现他的接口了
那List的接口有……
……喂这和说好的不一样啊
没事慢慢来
IEnumerable接口包含一个GetEnumerator()方法
GetEnumerator()返回一个IEnumerator,不懂的话,返回一个实现了IEnumerator接口的类,没错,就是迭代器
那这个类是什么
啊,你得自己写(掩面)
当然得符合规范,这个类得实现了IEnumerator接口
IEnumerator要求类实现了类似于c++中前向迭代器的功能,对,前向迭代器,他只能movenext或者reset。不过这对于foreach来说也足够了
那到你手里要怎么实现呢,看官方例子
略看一下,可以先总结出来几点
1.Current属性返回当前指着的东西(没错,解引用)
2.MoveNext()让下一次调用Current的时候指着下一个东西
3.Reset()让一切从头开始
可以看到,在最初始的状态,直接用Current的话,索引在-1。
这意味着想要遍历,必须先MoveNext再Current
同时,MoveNext在移动到的下个位置可用时返回true
对了,我们可以在这里推测出foreach的工作原理:
while (a.MoveNext())
dosomething(a.Current)
当然这都是题外话。
对了还有一个IDisposable接口,这是非泛型版本没有的,不过暂时不用管
这就是IEnumerable和IEnumerator,总结一下就是
实现了IEnumerable的类,可以用foreach对其迭代
然而为了实现IEnumerable,你还得自建一个实现了IEnumerator的类作为迭代器。
现在来讲ICollection。它是对IEnumerable的扩展,增加了Add,Clear,Contain等方法。简单的来说就是功能更强。
IList则是ICollection的增强,则实现了按索引修改、查找等神奇功能,对,一层层加强下来功能基本上就是c++里头的vector了(只是说功能,具体效率、空间等和实现方法有关)
ICollection的增强还有个分支,就是IDictionary,要求实现键值对的查找,实现了他的就是Dictionary,这是啥,对,就是STL_map。
今天看书看到泛型,泛型中用集合接口做了例子,就想顺便理一下集合的各种接口的意思
咱先假定已经知道什么是接口了,啊
注:以下大部分内容,只要在后面加一个< T > ,就可以泛型啦
C#中实现集合有很多办法,比如说数组,比如说ArrayList,比如说List
话说相比之下ArrayList和List比起来似乎一无是处,回头做个比较。
那么这么多办法还有一个就是自建一个集合类,是的,就和List一样,高大上。
那你想做这么个类,为了融入环境,人家List能做的,你也得能做,那就得实现他的接口了
那List的接口有……
[SerializableAttribute] public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
……喂这和说好的不一样啊
没事慢慢来
IEnumerable接口包含一个GetEnumerator()方法
GetEnumerator()返回一个IEnumerator,不懂的话,返回一个实现了IEnumerator接口的类,没错,就是迭代器
那这个类是什么
啊,你得自己写(掩面)
当然得符合规范,这个类得实现了IEnumerator接口
IEnumerator要求类实现了类似于c++中前向迭代器的功能,对,前向迭代器,他只能movenext或者reset。不过这对于foreach来说也足够了
那到你手里要怎么实现呢,看官方例子
// Defines the enumerator for the Boxes collection. // (Some prefer this class nested in the collection class.) public class BoxEnumerator : IEnumerator<Box> { private BoxCollection _collection; private int curIndex; private Box curBox; public BoxEnumerator(BoxCollection collection) { _collection = collection; curIndex = -1; curBox = default(Box); } public bool MoveNext() { //Avoids going beyond the end of the collection. if (++curIndex >= _collection.Count) { return false; } else { // Set current box to next item in collection. curBox = _collection[curIndex]; } return true; } public void Reset() { curIndex = -1; } void IDisposable.Dispose() { } public Box Current { get { return curBox; } } object IEnumerator.Current { get { return Current; } } }
略看一下,可以先总结出来几点
1.Current属性返回当前指着的东西(没错,解引用)
2.MoveNext()让下一次调用Current的时候指着下一个东西
3.Reset()让一切从头开始
可以看到,在最初始的状态,直接用Current的话,索引在-1。
这意味着想要遍历,必须先MoveNext再Current
同时,MoveNext在移动到的下个位置可用时返回true
对了,我们可以在这里推测出foreach的工作原理:
while (a.MoveNext())
dosomething(a.Current)
当然这都是题外话。
对了还有一个IDisposable接口,这是非泛型版本没有的,不过暂时不用管
这就是IEnumerable和IEnumerator,总结一下就是
实现了IEnumerable的类,可以用foreach对其迭代
然而为了实现IEnumerable,你还得自建一个实现了IEnumerator的类作为迭代器。
现在来讲ICollection。它是对IEnumerable的扩展,增加了Add,Clear,Contain等方法。简单的来说就是功能更强。
IList则是ICollection的增强,则实现了按索引修改、查找等神奇功能,对,一层层加强下来功能基本上就是c++里头的vector了(只是说功能,具体效率、空间等和实现方法有关)
ICollection的增强还有个分支,就是IDictionary,要求实现键值对的查找,实现了他的就是Dictionary,这是啥,对,就是STL_map。
相关文章推荐
- C#学习小记(1) - 集合接口ICollection,IEnumerable,IEnumerator等的关系
- C#接口之IEnumerable,IEnumerator
- C# 常用接口学习 ICollection<T>
- C#学习小记13接口的包容!像个泡菜坛子!
- c#学习笔记对IEnumerable<T>,IDictionary<Tkey,TValue>,ICollection<T>,IList<T>的总结
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与LinkedHashSet类))
- 迭代器,IEnumerator和IEnumerable的关系
- C#集合与接口(二)IEnumerable<T>接口
- C#接口学习之IEnumerable接口及其泛型版本(一)
- 黑马程序员--Java学习日记之集合(collection类与list接口)及泛型概述
- 阐述集合类的接口(IEnumerable,IEnumerator,ICollection,IList,IDictionary)
- IEnumerable是集合,IEnumerator是集合的迭代器
- 阐述集合类的接口(IEnumerable,IEnumerator,ICollection,IList,IDictionary)
- 几个JAVA集合中常用的接口学习:Collection、Iterator和Map
- C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能
- C#的foreach可以遍历不继承IEnumerable接口的集合
- 集合类接口IEnumerable,IEnumerator,ICollection,IList,IDictionary理解
- [C#]C#学习笔记-接口,集合与泛型
- java学习脚印:集合(Collection)之接口
- C#集合接口的继承关系图