c# 集合深入讲解

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、IDictionaryEnumeratorDictionaryEntry接口

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.6IComparableIComparer

这两个接口都是为了实现集合中各个元素的比较而设计的。IComparable定义了该类型可用于比较,具体的比较策略有具体的类实现,比如intfloatlong等这些基本的值类型都实现了IComparableIComparable<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命名空间这里都是范型集合分别对应与非范型的集合。只要掌握了非范型的集合的用法,那么范型多用即可掌握。如果有时间笔者会补上。

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值