1概述
由于项目比较紧,一直没有时间写博文,趁着最近比较闲暇,赶紧写几篇以作备忘之用,也希望对那些刚入门的人有所帮助吧。
集合的用途无处不在,但作用无外乎这么几种,容器、遍历、比较,输出、复制自身那么我们就来一同揭开.net集合的面纱吧,看看.netFramework类库是怎样设计的。
Ø在.Net中所有的集合都要实现 ICollection,IEnumerable,ICloneable接口。除此之外还有IList(用于有序或无序集合)、IDictionary(用于键值对集合)(泛型有相对应的接口这里为了简单只讨论非范型)
Ø还有几个辅助接口主要用于遍历策略的有如:IDictionaryEnumerator ,IEnumerator,前者集成自后者。
Ø主要用于比较策略的有:IComparable, IComparer接口。
1.1ICollection接口:
intCount{get;}//这个接口主要用于获得当前结合的元素个数,遍历集合时经常用到的一个属性。只读。
boolIsSynchronized{get;}//这个属性主要获取对集合的访问是否为线程安全的,这个主要用在多线程编程时,操作共有资源时用到。
objectSyncRoot{get;}//该属性本人不经常用到,官方文档解释如下:获取可用于同步System.Collections.ICollection访问的对象。
voidCopyTo(Arrayarray,intindex);//用于实现Copy策略Copy自身的全部元素到Array数组中,其实Array就相当于你定义的一维数组。Index是开始复制的索引。
1.2IEnumerable、IEnumerator接口
这两个接口决定了集合的遍历方式,和遍历策略。所有实现了IEnumerable接口的集合都可以使用foreach遍历元素的个数也可以采用IEnumeratorGetEnumerator();方法来得到一个IEnumerator类型实现遍历其中GetEnumerator()方法是IEnumerable接口的方法该接口只定义了一个接口方法。下面来说说IEnumerator这个接口的成员包括:
objectCurrent{get;}//获取集合中的当前元素返回object类型。
boolMoveNext();//推进到集合中的下一个元素,如果成功为true失败为false。可用来判断当前集合中的元素是否为空。使用时该方法与Current属性即可配合遍历整个集合。
voidReset();//重置集合元素即把MoveNext()方法的开始位置回归到原始状态这个位置在集合中第一的元素之前。
IEnumerable和IEnumerator的关系可以看做是依赖关系。
1.3ICloneable接口
该接口只有一个接口方法:objectClone();//创建作为当前实例副本的新对象。具体的拷贝策略有具体的集合来实现。
1.4IList接口
该接口定义了如下的成员:
boolIsFixedSize{get;}//该属性用于获得集合是否为固定大小的集合。
boolIsReadOnly{get;}//该属性用于获取集合是否只读。
objectthis[intindex]{get;set;}//这是一个可读可写的索引所有集成IList接口的集合都可以用[index]的方式来进行元素操作,其实其内部是利用数组实现的。有兴趣的朋友可以用reflector查看源码。
intAdd(objectvalue);//向集合中添加元素,该方法经常用到。
voidClear();//清空集合
boolContains(objectvalue);//判断集合是否包含某元素,该方法经常用到。
intIndexOf(objectvalue);//通过值获得该元素的索引位置
voidInsert(intindex,objectvalue);//在指定的位置插入元素
voidRemove(objectvalue);//从集合中除掉某一元素
voidRemoveAt(intindex);//在特定的位置移除某一元素。
1.5IDictionary、IDictionaryEnumerator、DictionaryEntry接口
1,IDictionary是无序列表接口,他的成员有:
ICollectionKeys{get;}//获取集合中key值的集合对象
ICollectionValues{get;}//获得集合中的Value值的集合对象。
objectthis[objectkey]{get;set;}//根据key值的可读可写索引
voidAdd(objectkey,objectvalue);//添加一个键值对
voidClear();//清空集合
boolContains(objectkey);//判断集合是否包含该建
IDictionaryEnumeratorGetEnumerator();//IDictionaryEnumerator类型的对象。
voidRemove(objectkey);去除一个键值对。、
2,IDictionaryEnumerator接口:
DictionaryEntryEntry{get;}//该方法获取一个当前字典类里面的键值对实体DictionaryEntry对象。
objectKey{get;}//获得当前集合的键值对的key值
objectValue{get;}//获得当前集合中的键值对的Value值。
3,DictionaryEntry这是一个简单的实体类:
成员包括Key和Value和一个构造函数
publicDictionaryEntry(objectkey,objectvalue);
publicobjectKey{get;set;}
publicobjectValue{get;set;}
1.6IComparable、IComparer
这两个接口都是为了实现集合中各个元素的比较而设计的。IComparable定义了该类型可用于比较,具体的比较策略有具体的类实现,比如int,float,long等这些基本的值类型都实现了IComparable和IComparable<T>接口。
IComparable接口的成员有:
intCompareTo(objectobj);//这个方法的实现是这样的,通过比较如果相等返回0,大于返回1小于返回-1;
那么如果不是值类型而是一个实体类如何比较大小呢?这时就用到了IComparer接口了这个接口让你可以自己定义两个对象的比较策略他的成员有:
intCompare(objectx,objecty);//通过比较如果相等返回0,第一个大于第二个返回1,第一个小于第二个返回-1;
1.7其他集合
1.栈
栈:常用的线性数据结构之一,遵守后进先出的原则(LIFO)
Stack这个集合里面我们只关注常用的方法即可,如下:
publicvirtualvoidPush(objectobj);//压栈操作压栈以后,栈顶指针指向最上面的元素的下一个空位(该栈是向上增长的)。
publicvirtualobjectPeek();//读栈操作读出栈顶的元素,不删除。
publicvirtualobjectPop();//出栈操作读出栈顶的同时,栈顶指针下移一个单位。即弹出第一个元素。
publicvirtualboolContains(objectobj);//判断该栈是否包含这个元素
publicvirtualvoidClear();//清空该栈。
2.队列
队列也是常用的线性数据结构之一,遵守先进先出的原则(FIFO)
Queue常用的操作有:
publicvirtualvoidEnqueue(objectobj);//进入队列排队
publicvirtualobjectPeek();读队列第一个元素
publicvirtualobjectDequeue();对队列并,弹出。
publicvirtualvoidClear();//清空队列
publicvirtualboolContains(objectobj);//判断队列是否包含某元素。
2总结
以上是对System.Collection命名空间下的集合类的剖析,当然在这个命名空间下还有更强大的Generic命名空间这里都是范型集合分别对应与非范型的集合。只要掌握了非范型的集合的用法,那么范型多用即可掌握。如果有时间笔者会补上。