C#笔记——集合和数据结构
本文最后更新于:2023年12月3日 晚上
常用集合
参见下表:
我要… | 泛型集合选项 | 非泛型集合选项 | 线程安全或不可变集合选项 |
---|---|---|---|
字典(将项存储为键/值对以通过键进行快速查找) | Dictionary<TKey, TValue> |
Hashtable |
ConcurrentDictionary<Tkey, TValue> ReadOnlyDictionary<TKey, TValue> ImmutableDictionary<TKey, TValue> |
列表(按索引访问项) | List<T> |
Array ArrayList |
ImmutableList<T> ImmutableArray |
队列 | Queue<T> |
Queue |
ConcurrentQueue<T> ImmutableQueue<T> |
栈 | Stack<T> |
Stack |
ConcurrentStack<T> ImmutableStack<T> |
链表(按顺序访问项) | LinkedList<T> |
无 | 无 |
删除集合中的项或向集合添加项时接收通知 | ObservableCollection<T> |
无 | 无 |
已排序的集合 | SortedList<TKey, TValue> |
SortedList |
ImmutableSortedDictionary<T> ImmutableSortedSet<T> |
集合(数学函数的一个集) | HashSet<T> SortedSet<T> |
无 | ImmutableHashSet<T> ImmutableSortedSet<T> |
然后来总结一下规律,如果我们要使用线程安全或不可变集合(不可变类型其实就是线程安全的)的话,就加上Concurrent
或者Immutable
前缀即可。
(顺带一提 Java 的 HashMap
等同于 C# 的 Dictionary
,我指用途,它们的底层实现还是不一样的)
所有集合都直接或间接基于ICollection<T>
或ICollection
接口。IList
和IDictionary
及其泛型对应项均派生自这两个接口。
在基于IList
或直接基于ICollection
的集合中,每个元素都只包含一个值。而在基于IDictionary
接口的集合中,每个元素都只包含一个键和一个值。
需要高效的多线程集合访问时,请使用System.Collections.Concurrent
命名空间中的泛型集合。
建议总是使用泛型集合,因为使用泛型集合可获得类型安全的自动化优点而无需从基集合类型派生和实现特定类型的成员。而且使用泛型时也不必对元素进行装箱(除非是值类型)。
Array
这个其实是 CLR 中所有数组的基类,比如:int[]
等,也是只有系统和编译器才能显式从Array
类派生。只要知道不同于ArrayList
动态数组,Array
具有固定的容量就行了。
下面是一些常用的属性:
属性名称 | 用途 |
---|---|
Length |
获取数组中元素总数 |
MaxLength |
获取数组实际长度(即可以有多少个元素) |
Rank |
获取数组的秩(维数) |
下面是一些常用的方法:
方法名称 | 用途 |
---|---|
BinarySearch |
用来查找某一个值的,这个方法有很多重载,建议自行查询 |
Clear(Array) |
清空指定数组的内容 |
Clone() |
浅复制 |
Copy(Array, Array, Int32) |
从一个数组复制元素到另一个数组,长度为32位整数 |
CopyTo(Array, Int32) |
从指定的索引处开始复制元素到另一个数组中 |
(OK那么到这里其实我发现一个问题,即使我在这里精简文档,它还是有那么多看上去就很有用很方便的方法,所以我觉得还是得平时多写和多看文档,在这里总结不下,所以我决定还是在文章中写一点文档中提到的小知识)
List
是ArrayList
的泛型实现,可变数组,该咋用咋用。
Queue/Stack
就是队列和栈,该咋用咋用。
LinkedList
就是链表,往里面存元素其实是存LinkedListNode<T>
,该咋用咋用。
Dictionary<TKey, TValue>
就是字典,该咋用咋用。
希望本文章能够帮到您~