由于项目比较紧,一直没有时间写博文,趁着最近比较闲暇,赶紧写几篇以作备忘之用,也希望对那些刚入门的人有所帮助吧。
集合的用途无处不在,但作用无外乎这么几种,容器、遍历、比较,输出、复制自身那么我们就来一同揭开.net集合的面纱吧,看看.netFramework类库是怎样设计的。
Ø 在.Net中所有的集合都要实现 ICollection,IEnumerable,ICloneable接口。除此之外还有IList(用于有序或无序集合)、IDictionary(用于键值对集合)(泛型有相对应的接口这里为了简单只讨论非范型)
Ø 还有几个辅助接口主要用于遍历策略的有如:IDictionaryEnumerator ,IEnumerator, 前者集成自后者。
Ø 主要用于比较策略的有:IComparable, IComparer接口。
int Count { get; }//这个接口主要用于获得当前结合的元素个数,遍历集合时经常用到的一个属性。只读。
bool IsSynchronized { get; }//这个属性主要获取对集合的访问是否为线程安全的,这个主要用在多线程编程时,操作共有资源时用到。
object SyncRoot { get; }// 该属性本人不经常用到,官方文档解释如下:获取可用于同步 System.Collections.ICollection 访问的对象。
void CopyTo(Array array, int index);//用于实现Copy策略Copy自身的全部元素到Array数组中,其实Array就相当于你定义的一维数组。Index是开始复制的索引。
这两个接口决定了集合的遍历方式,和遍历策略。所有实现了IEnumerable接口的集合都可以使用foreach遍历元素的个数也可以采用IEnumerator GetEnumerator();方法来得到一个IEnumerator类型实现遍历其中GetEnumerator()方法是IEnumerable接口的方法该接口只定义了一个接口方法。下面来说说IEnumerator这个接口的成员包括:
object Current { get; }//获取集合中的当前元素返回object类型。
bool MoveNext();//推进到集合中的下一个元素,如果成功为true失败为false。可用 来判断当前集合中的元素是否为空。使用时该方法与Current属性即可配合遍历整个集合。
void Reset();//重置集合元素即把MoveNext()方法的开始位置回归到原始状态这个位置在集合中第一的元素之前。
IEnumerable和IEnumerator的关系可以看做是依赖关系。
该接口只有一个接口方法:object Clone();//创建作为当前实例副本的新对象。具体的拷贝策略有具体的集合来实现。
该接口定义了如下的成员:
bool IsFixedSize { get; }//该属性用于获得集合是否为固定大小的集合。
bool IsReadOnly { get; }//该属性用于获取集合是否只读。
object this[int index] { get; set; }//这是一个可读可写的索引所有集成IList接口的集合都可以用[index]的方式来进行元素操作,其实其内部是利用数组实现的。有兴趣的朋友可以用reflector查看源码。
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);//在特定的位置移除某一元素。
1,IDictionary 是无序列表接口,他的成员有:
ICollection Keys { get; }//获取集合中key值的集合对象
ICollection Values { get; }//获得集合中的Value值的集合对象。
object this[object key] { get; set; }//根据key值的可读可写索引
void Add(object key, object value);//添加一个键值对
void Clear();//清空集合
bool Contains(object key);//判断集合是否包含该建
IDictionaryEnumerator GetEnumerator();//IDictionaryEnumerator类型的 对象。
void Remove(object key);去除一个键值对 。、
2,IDictionaryEnumerator接口:
DictionaryEntry Entry { get; }//该方法获取一个当前字典类里面的键值对实体DictionaryEntry对象。
object Key { get; }//获得当前集合的键值对的key值
object Value { get; }//获得当前集合中的键值对的Value值。
3,DictionaryEntry这是一个简单的实体类:
成员包括Key和Value和一个构造函数
public DictionaryEntry(object key, object value);
public object Key { get; set; }
public object Value { get; set; }
这两个接口都是为了实现集合中各个元素的比较而设计的。IComparable定义了该类型可用于比较,具体的比较策略有具体的类实现,比如int,float,long等这些基本的值类型都实现了IComparable和IComparable
IComparable接口的成员有:
int CompareTo(object obj);//这个方法的实现是这样的,通过比较如果相等返回0,大于返回1小于返回-1;
那么如果不是值类型而是一个实体类如何比较大小呢?这时就用到了IComparer接口了这个接口让你可以自己定义两个对象的比较策略他的成员有:
int Compare(object x, object y);// 通过比较如果相等返回0,第一个大于第二个返回1,第一个小于第二个返回-1;
1. 栈
栈:常用的线性数据结构之一,遵守后进先出的原则(LIFO)
Stack这个集合里面我们只关注常用的方法即可,如下:
public virtual void Push(object obj);//压栈操作压栈以后,栈顶指针指向最上面的元素的下一个空位(该栈是向上增长的)。
public virtual object Peek();//读栈操作读出栈顶的元素,不删除。
public virtual object Pop();//出栈操作读出栈顶的同时,栈顶指针下移一个单位。即弹出第一个元素。
public virtual bool Contains(object obj);//判断该栈是否包含这个元素
public virtual void Clear();//清空该栈。
2. 队列
队列也是常用的线性数据结构之一,遵守先进先出的原则(FIFO)
Queue常用的操作有:
public virtual void Enqueue(object obj);//进入队列排队
public virtual object Peek();读队列第一个元素
public virtual object Dequeue();对队列并,弹出。
public virtual void Clear();//清空队列
public virtual bool Contains(object obj);//判断队列是否包含某元素。
以上是对System.Collection命名空间下的集合类的剖析,当然在这个命名空间下还有更强大的Generic命名空间这里都是范型集合分别对应与非范型的集合。只要掌握了非范型的集合的用法,那么范型多用即可掌握。如果有时间笔者会补上。