Stack类
ns:System.Collections
此类模仿了一个简单的先进后出(LIFO)的集合 它实现了ICollection接口
可以通过三种方式创建Stack类对象
Stack stack = new Stack();//初始化Stack 默认初始长度为10 stack.Push("sam"); Stack stack = );//初始化Stack 指定长度为20 stack.Push("sam"); ArrayList list = new ArrayList(); list.Add("sam"); list.Add("leo"); Stack stack = new Stack(list);//将一个实现了ICollection接口的类型实例作为参数初始化Stack
Stack类的属性
Count属性
获取元素总数
SyncRoot属性
获取一个对Stack对象同步访问的对象 因为Stack对象默认不是线程安全的对象 所以如果同步操作 则同步操作应该在Stack的SyncRoot上执行
IsSynchronized属性
获取一个值 该值表示是否是同步对Stack对象的访问 默认false
Stack类的方法
Synchronized静态方法
在参数指定的Stack对象中放置一个同步(线程安全)的包装器 并返回包装版本
Peek方法
获取集合中处于最深处的元素
ArrayList list = new ArrayList(); list.Add("sam"); list.Add("leo"); Stack stack = new Stack(list); Console.WriteLine(stack.Peek());//return leo
Pop方法
删除集合中处于最深处的元素 并返回删除的元素
ArrayList list = new ArrayList(); list.Add("sam"); list.Add("leo"); Stack stack = new Stack(list); Console.WriteLine(stack.Pop());//return leo Console.WriteLine(stack.Pop());//return sam
Push方法
将参数指定的元素压入集合
Stack stack = new Stack(list); stack.Push("korn"); Console.WriteLine(stack.Peek());//return korn
ToArray方法
将集合中的元素拷贝到数组中 并返回数组
Clear、Clone、Contains、CopyTo、GetEnumerator方法 略……
Stack是一个先进后出的集合 测试如下
Stack queue = new Stack(); queue.Push("sam"); queue.Push("leo"); queue.Push("korn"); ) { Console.WriteLine(queue.Pop()); }
删除顺序为 korn leo sam
Queue类
ns:System.Collections
此类模仿了一个简单的先进先出(FIFO)的集合 它实现了ICollection接口 Queue对象有一个初始的容量来存储元素 如果存储的元素的容量达到了这个初始容量 那么它还会自动增长 可以在初始化Queue时 提供一个值来指示它容量的增长系数 默认值为2 即容量已满 容量自动倍增
可以通过四种方式创建Queue类对象
Queue queue = new Queue();//初始化Queue 默认初始长度为10 queue.Enqueue("sam"); //…… Stack queue = );//初始化Queue 指定长度为20 queue.Enqueue("sam"); //…… Stack queue = ,3.0);//初始化Queue 指定长度为20 容量增长系数3.0 queue.Enqueue("sam"); //…… ArrayList list = new ArrayList(); list.Add("sam"); list.Add("leo"); Queue queue = new Queue(list);//将一个实现了ICollection接口的类型实例作为参数初始化Queue
Queue类的属性
Count属性
获取元素总数
SyncRoot属性
获取一个对Queue对象同步访问的对象 因为Queue对象默认不是线程安全的对象 所以如果同步操作 则同步操作应该在Queue的SyncRoot上执行
IsSynchronized属性
获取一个值 该值表示是否是同步对Queue对象的访问 默认false
Queue类的方法
Synchronized静态方法
在参数指定的Queue对象中放置一个同步(线程安全)的包装器 并返回包装版本
Peek方法
获取集合中处于最外处的元素
Queue queue = new Queue(); queue.Enqueue("sam"); queue.Enqueue("leo"); Console.WriteLine(queue.Peek());//return sam
Dequeue方法
删除集合中处于最外处的元素 并返回删除的元素
Enqueue方法
将参数指定的元素压入集合
ToArray方法
将集合中的元素拷贝到数组中 并返回数组
TrimToSize
将Queue的容量设置为它所包含的的元素总数 以节省容量 默认容量是10
Clear、Clone、Contains、CopyTo、GetEnumerator方法 略……
Queue是一个先进先出的集合 测试如下
Queue queue = new Queue(); queue.Enqueue("sam"); queue.Enqueue("leo"); queue.Enqueue("korn"); queue.TrimToSize(); ) { Console.WriteLine(queue.Dequeue()); }
删除顺序为 sam leo korn
ArrayList类
ns:System.Collections
此类可以看成是一个动态的数组 它实现了IList接口 可以随时添加项进去 它的容量可以自动增长 ArrayList是弱类型的 即它可以包含任何类型的元素 当你不知道要添加的元素的类型或希望能存储不同类型的元素时 可以考虑使用ArrayList 此类不是线程安全的 比如两个不同的线程可以在同一时刻向它添加元素 可以使用它的SyncRoot属性来保证线程安全
ArrayList list = new ArrayList(); lock (list.SyncRoot) { //…… }
或者使用它的静态方法Synchronized来创建一个保证线程安全的包装器
ArrayList list = new ArrayList(); ArrayList syncList = ArrayList.Synchronized(list); lock (syncList) { //…… }
*同步对象依然需要加锁 否则多个线程依然可以同时访问集合
ArrayList类的属性
this[index]索引器
获取指定下标处的元素
Count属性
获取元素总数
SyncRoot属性
获取一个对ArrayList对象同步访问的对象 因为ArrayList对象默认不是线程安全的对象 所以如果同步操作 则同步操作应该在ArrayList的SyncRoot上执行
IsSynchronized属性
获取一个值 该值表示是否是同步对ArrayList对象的访问 默认false
Capacity
设置或获取集合所能容纳的元素数
ArrayList类的静态方法
Synchronized静态方法
创建一个保证线程安全的包装器 返回一个表示包装器的ArrayList对象
Adapter静态方法
为参数指定的IList对象添加一个ArrayList线程安全的包装器
ArrayList list = new ArrayList(); IList myList=ArrayList.Adapter(list); lock (myList) { myList.Add("sam"); }
FixedSize静态方法
与Adapter方法类似 但IList容量大小是固定的 不能修改或删除IList的元素 如果修改或删除将抛出异常
ReadOnly静态方法
与Adapter方法类似 但IList是只读的 尝试修改删除将抛出异常
Repeat静态方法
将集合中的元素浅拷贝N次后存储到一个新的ArrayList对象中 并返回该对象 参数object表示集合中的元素 count表示准备拷贝几次
ArrayList list = new ArrayList(); list.Add("sam"); ArrayList newAryList=ArrayList.Repeat();//将元素sam拷贝10次 存入新集合
ArrayList类的实例方法
Add方法
向集合中添加参数指定的元素 并返回该元素的下标
AddRange方法
将参数指定的实现了ICollection的集合的元素添加到当前集合中
Insert方法
插入一个新的元素到集合中 其下标由参数index指定
InsertRange方法
插入一个集合到当前集合中 其起始下标由参数index指定
Clear方法
清空集合的元素
Remove方法
从集合中删除参数指定的元素
RemoveAt方法
从集合中删除参数指定的下标处的元素
RemoveRange方法
从集合中删除多个元素 多个元素的范围由startIndex和count指定
BinarySearch方法
对当前集合对象的元素执行一次二进制查找 该方法具有多个重载 它的参数如下
value:元素对象
compare:一个实现了ICompare接口的对象 该对象用于自定义查找标准
startIndex:查找的起始下标
count:查找的个数 将以起始下标为起点到count指定的数值为查找终结点
IndexOf
查找集合中的参数指定的元素 可通过startIndex和length定义查找在集合中的某个子集进行 查到返回元素的下标 查不到返回-1
LastIndexOf
与IndexOf的区别仅在于 此方法反向查找
Contains方法
集合是否包含参数指定的元素
Clone方法
返回一个对当前集合的浅拷贝的集合对象 相当于产生了一个对原集合的引用
CopyTo方法
将集合的元素或一部分元素拷贝到参数指定的数组中 前提是数组元素必须和集合元素相兼容 此方法具有多个重载 它的参数如下
array:目标数组
arrayIndex:指定集合中被拷贝的元素在目标数组中的起始下标
sourceIndex:指定集合中被拷贝的元素的起始下标
count:指定集合中被拷贝的元素的个数
SetRange方法
将参数指定的集合拷贝到当前集合中 可以通过参数startIndex指定要从参数指定的集合的下标处开始拷贝
Sort方法
将集合中的元素排序 默认使用的排序规则是由集合的每个元素实现的IComparer 你可以通过comparer参数指定自己的排序规则 还可以通过startIndex和count指定集合的一个子集应用排序
GetEnumerator方法
获取一个可用于遍历集合的IEnumerator对象 可以指定startIndex和count来返回一个映射了集合的子集的IEnumerator对象 它将只遍历集合的一部分
Reverse方法
倒转集合 可以通过参数startIndex和count指定要倒转的集合的一个子集
ToArray方法
将集合元素拷贝到参数指定的数组中 可以通过参数type指定数组的类型 默认是object
TrimToSize方法
使集合的容量等于它所包含的的元素数量 如果该集合是只读的或大小固定的 使用此方法将会抛出异常
Hashtable类
ns:System.Collections
此类是一个封装了键值对的集合 元素根据键的哈希码组织在一起 可以随时添加项进去 它的容量可以自动增长 Hashtable中的元素是无序列的 它们只能靠键来访问 正因为如此 Hashtable在性能上要优于SortedList .NET通过DictionaryEntry结构来表示Hashtable中的元素 所以可以使用该结构来遍历Hashtable 如
Hashtable list = new Hashtable(); list.Add(,"sam"); list.Add(, "leo"); list.Add(, "korn"); foreach (DictionaryEntry entry in list) { Console.WriteLine("key{0},value{1}",entry.Key, entry.Value); }
Hashtable类的属性
this[Key]索引器
获取指定键的元素
Count属性
获取元素总数
SyncRoot属性
获取一个对Hashtable对象同步访问的对象 因为Hashtable对象默认不是线程安全的对象 所以如果同步操作 则同步操作应该在Hashtable的SyncRoot上执行
IsSynchronized属性
获取一个值 该值表示是否是同步对Hashtable对象的访问 默认false
Keys
获取集合的所有键
Values
获取集合的所有元素
Hashtable类的方法
Synchronized静态方法
创建一个保证线程安全的包装器 返回一个表示包装器的Hashtable对象
Add方法
向集合中添加参数指定的Key和Value
Remove方法
从集合中删除参数指定的Key对应的元素
Clear方法
清空集合的元素
Contains方法
集合是否包含参数指定的Key所对应的元素
ContainsKey方法
作用于Contains相同
ContainsValue方法
集合是否包含参数指定的Value
Clone方法
返回一个对当前集合的浅拷贝的集合对象 相当于产生了一个对原集合的引用
CopyTo方法
此方法由实现了ICollection的对象来调用 比如Hashtable的Keys或者Values可以调用该方法 用于将Keys或者Values包含的Key或Value拷贝到数组中
Hashtable list = new Hashtable(); list.Add(, "sam"); list.Add(, "leo"); list.Keys.CopyTo((); list.Values.CopyTo(();
GetEnumerator方法
获取一个可用于遍历集合的IDictionaryEnumerator对象
SortedList类
ns:System.Collections
此类是一个封装了键值对的集合 元素根据键的哈希码组织在一起 可以随时添加项进去 它的容量可以自动增长 它与Hashtable不太一样 它所包含的元素会按照键进行排序 所以元素既可以通过Key来获取也可以通过下标来获取键一般都是int或者string类型的 键也可以是自定义的类型 我们说SortedList的元素会自动根据键排序 但如果键是一个非string的引用类型 则你可以传递一个IComparer对象实现自定义排序
SortedList类的属性
this[Key]索引器
获取指定键的元素
Count属性
获取元素总数
SyncRoot属性
获取一个对SortedList对象同步访问的对象 因为SortedList对象默认不是线程安全的对象 所以如果同步操作 则同步操作应该在SortedList的SyncRoot上执行
IsSynchronized属性
获取一个值 该值表示是否是同步对SortedList对象的访问 默认false
Capacity属性
设置或获取集合所能容纳的元素数
Keys属性
获取集合的所有键
Values属性
获取集合的所有元素
SortedList类的方法
Synchronized静态方法
创建一个保证线程安全的包装器 返回一个表示包装器的SortedList对象
Add方法
向集合中添加参数指定的Key和Value
Remove方法
从集合中删除指定的元素 参数可以是Key也可以是index 参数index表示要删除的元素的下标
Clear方法
清空集合的元素
SetByIndex方法
修改参数指定的下标处的元素
Clone方法
返回一个对当前集合的浅拷贝的集合对象 相当于产生了一个对原集合的引用
CopyTo方法
此方法由实现了ICollection的对象来调用 比如SortedList的Keys或者Values可以调用该方法 用于将Keys或者Values包含的Key或Value拷贝到数组中
SortedList list = new SortedList(); list.Add(, "sam"); list.Add(, "leo"); list.Keys.CopyTo((); list.Values.CopyTo(();
Contains方法
集合是否包含参数指定的Key所对应的元素
ContainsKey方法
作用于Contains相同
ContainsValue方法
集合是否包含参数指定的Value
GetEnumerator方法
获取一个可用于遍历集合的IDictionaryEnumerator对象
GetByIndex方法
获取参数指定的下标处的元素
GetKey方法
获取参数指定的下标处的Key
GetKeyList方法
获取集合的所有键
GetValueList方法
获取集合中所有元素
IndexOfKey方法
获取集合中由参数指定的Key所对应的元素的下标 找不到返回-1
IndexOfValue方法
获取集合中由参数指定的元素的下标 找不到返回-1
TrimToSize方法
使集合的容量等于它所包含的的元素数量 如果该集合是只读的或大小固定的 使用此方法将会抛出异常
泛型集合(强类型集合)
集合可以存储任意的对象 因为集合将这些对象统统当做了object来处理 如何规定集合只能存储某种特定的类型呢 此时可以考虑使用泛型集合 以下介绍两种泛型集合
List<T>泛型集合类
一个动态的数组 它实现了IList接口 可以随时添加项进去 可以随时添加项进去 它的容量可以自动增长 类似于ArrayList 但两个类的区别在于ArrayList是弱类型的 即它可以包含任何类型的元素 而List<T>包含的元素类型被预定义为T类型 List<T>的属性与方法与ArrayList差不多是一样的 这里不再做罗列
Dictionary<K,V>泛型集合类
此类是一个封装了键值对的集合 元素根据键的哈希码组织在一起 可以随时添加项进去 它的容量可以自动增长 类似于Hashtable 但两个类的区别在于Hashtable是弱类型的 即它可以包含任何类型的元素 而Dictionary<K,V>包含的元素的Key被预定义为K类型、元素的类型被预定义为V类型 Dictionary<K,V>的属性与方法与Hashtable差不多是一样的 这里不再做罗列 在迭代Dictionary<K,V>类型的集合时 KeyValuePair<K, V> 类型对应于迭代Hashtable时使用的DictionaryEntry 可做如下迭代
Dictionary<string, Animal> list = new Dictionary<string, Animal>(); list.Add("animal1", new Animal()); foreach (KeyValuePair<string, Animal> item in list) { Console.Write("键:" + item.Key); Console.Write("值:" + item.Value.name); }
下面通过Dictionary<K,V>类实现计算字符串中字符的重复次数 并输出结果
string str = "hellohol"; Dictionary<char, int> list = new Dictionary<char, int>(); foreach (char s in str) { if (list.ContainsKey(s)) { list[s] = Convert.ToInt32(list[s]) + ; } else { list.Add(s, ); } } foreach (char s in list.Keys) { Console.WriteLine("{0}出现次数为:{1}", s, list[s]); }
输出结果