c# 集合深入讲解

1概述

由于项目比较紧,一直没有时间写博文,趁着最近比较闲暇,赶紧写几篇以作备忘之用,也希望对那些刚入门的人有所帮助吧。

集合的用途无处不在,但作用无外乎这么几种,容器、遍历、比较,输出、复制自身那么我们就来一同揭开.net集合的面纱吧,看看.netFramework类库是怎样设计的。

Ø .Net中所有的集合都要实现 ICollection,IEnumerable,ICloneable接口。除此之外还有IList(用于有序或无序集合)、IDictionary(用于键值对集合)(泛型有相对应的接口这里为了简单只讨论非范型)

Ø 还有几个辅助接口主要用于遍历策略的有如:IDictionaryEnumerator IEnumerator, 前者集成自后者。

Ø 主要用于比较策略的有:IComparable IComparer接口。

1.1 ICollection接口:

int Count { get; }//这个接口主要用于获得当前结合的元素个数,遍历集合时经常用到的一个属性。只读。

bool IsSynchronized { get; }//这个属性主要获取对集合的访问是否为线程安全的,这个主要用在多线程编程时,操作共有资源时用到。

object SyncRoot { get; }// 该属性本人不经常用到,官方文档解释如下:获取可用于同步 System.Collections.ICollection 访问的对象。

void CopyTo(Array array, int index);//用于实现Copy策略Copy自身的全部元素到Array数组中,其实Array就相当于你定义的一维数组。Index是开始复制的索引。

1.2 IEnumerableIEnumerator接口

   这两个接口决定了集合的遍历方式,和遍历策略。所有实现了IEnumerable接口的集合都可以使用foreach遍历元素的个数也可以采用IEnumerator GetEnumerator();方法来得到一个IEnumerator类型实现遍历其中GetEnumerator()方法是IEnumerable接口的方法该接口只定义了一个接口方法。下面来说说IEnumerator这个接口的成员包括:

object Current { get; }//获取集合中的当前元素返回object类型。

bool MoveNext();//推进到集合中的下一个元素,如果成功为true失败为false。可用 来判断当前集合中的元素是否为空。使用时该方法与Current属性即可配合遍历整个集合。

void Reset();//重置集合元素即把MoveNext()方法的开始位置回归到原始状态这个位置在集合中第一的元素之前。

IEnumerable和IEnumerator的关系可以看做是依赖关系。

1.3 ICloneable接口

该接口只有一个接口方法:object Clone();//创建作为当前实例副本的新对象。具体的拷贝策略有具体的集合来实现。

1.4 IList接口

该接口定义了如下的成员:

bool IsFixedSize { get; }//该属性用于获得集合是否为固定大小的集合。

 bool IsReadOnly { get; }//该属性用于获取集合是否只读。

object this[int index] { getset; }//这是一个可读可写的索引所有集成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.5 IDictionaryIDictionaryEnumeratorDictionaryEntry接口

1,IDictionary  是无序列表接口,他的成员有:

ICollection Keys { get; }//获取集合中key值的集合对象

ICollection Values { get; }//获得集合中的Value值的集合对象。

object this[object key] { getset; }//根据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 { getset; }

public object Value { getset; }

1.6 IComparableIComparer

这两个接口都是为了实现集合中各个元素的比较而设计的。IComparable定义了该类型可用于比较,具体的比较策略有具体的类实现,比如intfloatlong等这些基本的值类型都实现了IComparableIComparable接口。

IComparable接口的成员有:

int CompareTo(object obj);//这个方法的实现是这样的,通过比较如果相等返回0,大于返回1小于返回-1;

 

那么如果不是值类型而是一个实体类如何比较大小呢?这时就用到了IComparer接口了这个接口让你可以自己定义两个对象的比较策略他的成员有:

int Compare(object x, object y);// 通过比较如果相等返回0,第一个大于第二个返回1,第一个小于第二个返回-1;

1.7 其他集合

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);//判断队列是否包含某元素。

2总结

以上是对System.Collection命名空间下的集合类的剖析,当然在这个命名空间下还有更强大的Generic命名空间这里都是范型集合分别对应与非范型的集合。只要掌握了非范型的集合的用法,那么范型多用即可掌握。如果有时间笔者会补上。

你可能感兴趣的:(c# 集合深入讲解)