C#初学者教程系列14:集合

本文是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#初学者教程系列14:集合

同理,其它的集合类,也是大同小异的,你总能找到对应的方法,虽然略有差异。

六、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写法。这方面的代码,网上已经有现成的,各位可以自行找一下。

 

祝您用餐愉快。

上一篇:java 中几种常用数据结构


下一篇:集合工具类 Collections 和数组工具类 Arrays