C# - 集合类 - 集合类型

时间:2021-12-30 11:11:55

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]);
 }

输出结果

C# - 集合类 - 集合类型

C# - 学习总目录