首先所谓集合是用于管理对象的容器类。一方面集合将独立的对象汇集成群集,作为一个群集来管理,以便进行整体性操作;而另一方面,集合可以方便地获取群集中的个体,进行个体化操作。在.Net中,集合被封装为对象,一个集合类型在本质都是一个类,例如ArrayList,Hashtable等,通过封装来实现信息隐藏,通过继承来实现功能扩展等,同时泛型集合也提供了更加多样的应用体验。
每个集合类都必然实现了IEnumerable接口(.Net里好多这样的基础接口如ICloneable),这也就意味着任何集合类都具有了GetEnumerator方法,也得以foreach语句遍历集合对象称为可能。
下面大概写下集合的一些基本类型接口:
在.Net角度看集合,集合为实现了若干接口的类。以ArrayList为例,其定义可以表示为:
public class ArrayList:IList,ICollection,IEnumerable,ICloneable
public interface IEnumerable { IEnumerator GetEnumerator(); } public interface ICollection : IEnumerable { void CopyTo(Array array, int index); int Count { get; } bool IsSynchronized { get; } object SyncRoot { get; } } public interface IList : ICollection, IEnumerable { int Add(object value); void Clear(); bool Contains(object value); int IndexOf(object value); void Insert(int index, object value); void Remove(object value); void RemoveAt(int index); bool IsFixedSize { get; } bool IsReadOnly{get;} object this[int index] { get; set; } }
IList提供了添加,清空,插入,删除,查找等多种操作,同时具有固定长度和只读属性,能够按照索引方式访问,另外还继承了ICollection和IEnumerable接口。可以看到这些基础集合接口的继承层次顺序是很清楚的,ICollection继承了IEnumerable,IList又同时继承了ICollection,IEnumerable。此外还可以看到在IEnumerable接口里返回IEnumerator接口对象,以公开枚举数,支持非泛型集合的简单迭代,为foreach操作提供支持。在.Net中,集合类必须严格实现IEnumerable接口才能与foreach兼容。关于它们的具体方法和属性介绍,我就不写在博客里了,.Net方法名和智能化提示已经让我们能够快速判断辨识出某方法和属性是用来实现什么功能的,参数类型,是否重载等等有相关提示,查查msdn里面都有详细解释。我写的c#学习笔记引用了一些以前我看过的书如《c#技术解密》《你必须知道的.Net》《c#程序设计》等等和msdn等网上有用的资料,我把它们里面就目前我学习掌握到的用自己的理解写下。如那方面有问题,还请多多指教。
好了,回归正题,刚才说到那个IEnumerator接口,有必要写一下此接口的用法。在.Net中可以通过枚举器实现简单的循环访问集合:枚举器实现了IEnumerator接口,其定义如下:
public interface IEnumerator { bool MoveNext(); object Current { get; } void Rest(); }
Current表示集合当前成员,Rest方法将枚举数复位到集合开始,并设置Current到第一个元素之前。看看我下面写的这行代码:
ArrayList arr=new ArrayList(); arr.Add(1); arr.Add(2); List<string > intArr = new List<string>(); intArr.Add("LX"); intArr.Add("一木"); IEnumerator myArryList = arr.GetEnumerator(); IEnumerator myList = intArr.GetEnumerator(); while (myArryList.MoveNext()&&myList.MoveNext()) { Console.WriteLine(myArryList.Current+" "+myList.Current); } Console.Read();
以ArrayList集合来管理不同类型的对象,会存在装箱和拆箱问题,从而影响性能,我们可以从泛型集合List<T>来代替。
在说一下按照集合类型实现的接口来分,集合主要分为:有序集合,索引集合和键式集合。
有序集合,主要是指仅实现了ICollection接口的集合类,如Stack和Queue。
索引集合,主要是实现了IList接口的集合类,如Array,ArrayList。
键式集合,主要是实现了IDictionary接口的集合类,如Hashtable,ListDictionary。
有时间的话再写,这些常用集合的操作。