本文是C#初学者简单教程,这是第14篇。感谢观看,记得关注我,后续还有更多教程文章,谢谢。
本文环境为Visual Studio 2019。
一、集合的定义
将具有同一类型的多个对象放到一个组中进行管理,则是集合。集合可以*的添加或者删除一个对象。
二、集合跟数组的区别
数组是固定大小的,而集合可以进行扩大或者缩小。
数组是强类型的,但集合一旦泛型化,则也一样是强类型。Object在C#中是弱类型,其它为强类型。
三、C#中的集合
C#中的集合都将实现IEnumerable和ICollection接口。ICollection是集合接口,IEnumerable声明为可枚举。
C#中的集合类特别多,举几个例子,当然不止这些:
Collection
Hashtable
Stack
Queue
ArrayList
List
Dictionary<string, string>
SortedList
BitArray
ConcurrentDictionary
四、声明一个集合
以最典型的集合类List来说,要声明它是很简单的,由于集合都是类,所以声明一个类,就是new一个对象:
List<string> list = new List<string>();
五、操作一个集合
对于List这个集合类来说,添加使用Add方法,删除使用Remove方法,索引器使用[index],遍历直接foreach即可。代码如下:
同理,其它的集合类,也是大同小异的,你总能找到对应的方法,虽然略有差异。
六、C#的集合类的命名空间
C#中的集合类位于下面3个命名空间中:
- System.Collections.Generic
- System.Collections.Concurrent
- System.Collections
七、System.Collections
System.Collections 命名空间中的类不会将元素作为特别类型化的对象存储,而是作为 Object
类型的对象存储。所以该命名空间下的集合不是强类型的。
主要有:
ArrayList | 表示对象的数组,这些对象的大小会根据需要动态增加。 |
Hashtable | 表示根据键的哈希代码进行组织的键/值对的集合。 |
Queue | 表示对象的先进先出 (FIFO) 集合。 |
Stack | 表示对象的后进先出 (LIFO) 集合。 |
八、System.Collections.Generic
Generic 中文翻译为泛型,也就是通用类型。所以该命名空间下的集合类,都是<>泛型的。
主要有:
Dictionary<TKey,TValue> | 表示基于键进行组织的键/值对的集合。 |
List<T> | 表示可按索引访问的对象的列表。 提供用于对列表进行搜索、排序和修改的方法。 |
Queue<T> | 表示对象的先进先出 (FIFO) 集合。 |
SortedList<TKey,TValue> | 表示基于相关的 IComparer<T> 实现按键进行排序的键/值对的集合。 |
Stack<T> | 表示对象的后进先出 (LIFO) 集合。 |
九、System.Collections.Concurrent
Concurrent 中文翻译为并发,所以该命名空间下的集合类,都是在多线程并发的条件下是线程安全的。
我们知道,像List、Dictionary<,>等都不是线程安全的,如果您要让它线程安全,就要改用Concurrent命名空间下的集合类。
该空间下的集合类主要有:
ConcurrentBag<T> | 表示对象的线程安全的无序集合。 |
ConcurrentDictionary<TKey, TValue> | 表示可由多个线程同时访问的键/值对的线程安全集合。 |
ConcurrentQueue<T> | 表示线程安全的先进先出 (FIFO) 集合。 |
ConcurrentStack<T> | 表示线程安全的后进先出 (LIFO) 集合。 |
十、怎么知道自己要用什么集合
这个要看您的业务而定。
如果您不是在多线程下运行,则普通的集合类System.Collections的集合即可。
若您的系统需要多线程和高并发,那么Concurrent命名空间的集合则是您的首选。
如果您需要强类型,即指定类型的集合,则泛型是您的优先选择,通常我们平时开发一般都是泛型集合类居多。其中LIst<>、Dictionary<,>是很常用的。
只要有可能,我们都是建议您首选泛型集合以及线程安全的集合。而不是使用弱类型的集合,因为那需要装箱拆箱,会带来性能损耗。
最后,您也可以自行lock编写线程安全的集合,如List的线程安全lock写法。这方面的代码,网上已经有现成的,各位可以自行找一下。
祝您用餐愉快。