C# 都有哪些集合?
在 C# 中,集合(Collection)是用来存储一组数据的对象,通常是同一类型的数据。C# 提供了多种不同类型的集合,每种集合都有其独特的特点和用途。
常见的集合可以分为以下几类:数组、泛型集合、非泛型集合、其他集合类型、并发集合
1. 数组(Array)
定义:数组是 C# 中最基本的集合类型,用来存储固定大小的同类型元素。
特点:
- 固定大小,一旦创建,大小不可更改。
- 支持按索引访问元素,查找速度快。
常用操作:访问、修改元素、遍历、排序、查找等。
示例:
int[] arr = new int[5]; // 创建一个包含5个元素的整型数组
arr[0] = 1; // 设置第一个元素为1
Console.WriteLine(arr[0]); // 输出1
2. 泛型集合(Generic Collections)
定义:泛型集合是 C# 中更为强大和灵活的集合类型,通过 System.Collections.Generic 命名空间提供。它们可以存储特定类型的元素,避免了类型转换,提供了更高的类型安全。
常见泛型集合:
List < T >
定义:List < T > 是一个动态数组,可以自动调整大小。
特点:
- 支持按索引访问。
- 支持动态添加、删除元素。
- 更灵活、更高效。
常用操作:添加、删除、插入、查找、排序等。
示例:
List<int> list = new List<int>();
list.Add(10);
list.Add(20);
list.Add(30);
list.RemoveAt(1); // 删除索引为1的元素
Dictionary<TKey, TValue>
定义:Dictionary<TKey, TValue> 是一个基于键值对的集合,用于存储映射关系。
特点:
- 键值对,允许通过键访问值。
- 键是唯一的,值可以重复。
常用操作:添加、删除、查找、更新、键值对遍历等。
示例:
Dictionary<string, int> dict = new Dictionary<string, int>();
dict["apple"] = 5;
dict["banana"] = 3;
Console.WriteLine(dict["apple"]); // 输出 5
HashSet< T >
定义:HashSet 是一个不允许重复元素的集合,基于哈希表实现。
特点:
- 不允许重复元素。
- 无序存储,无法通过索引访问。
- 适合用来做集合运算(并集、交集、差集等)。
常用操作:添加、删除、查找、集合运算等。
示例:
HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);
set.Add(2); // 重复的元素不会添加
Queue< T >
定义:Queue 是一个先进先出(FIFO)的集合类型。
特点:
- 只能从队列的头部移除元素。
- 适用于需要保持元素顺序的场景。
常用操作:入队、出队、查看队头等。
示例:
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
int item = queue.Dequeue(); // 取出并移除队首元素
Stack< T >
定义:Stack 是一个后进先出(LIFO)的集合类型。
特点:
- 只能从栈顶添加和移除元素。
- 适用于需要回溯、递归等场景。
常用操作:入栈、出栈、查看栈顶等。
示例:
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
int item = stack.Pop(); // 移除栈顶元素
3. 非泛型集合(Non-Generic Collections)
定义:非泛型集合位于 System.Collections 命名空间中,它们可以存储任何类型的数据,但使用时需要进行类型转换,因此不如泛型集合安全。
常见非泛型集合:
ArrayList
定义:ArrayList 是一个动态数组,支持任意类型的元素。
特点:
- 不同于泛型集合,它允许存储不同类型的元素。
- 需要使用类型转换。
示例:
ArrayList list = new ArrayList();
list.Add(10);
list.Add("hello");
int num = (int)list[0]; // 需要强制类型转换
Hashtable
定义:Hashtable 是一个键值对集合,类似于 Dictionary,但不支持泛型。
特点:
- 键值对存储,键是唯一的,值可以重复。
- 需要手动进行类型转换。
示例:
Hashtable table = new Hashtable();
table["name"] = "John";
table["age"] = 30;
Queue
定义:非泛型的 Queue,与泛型 Queue 类似,但不支持类型安全。
示例:
Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue(2);
Stack
定义:非泛型的 Stack,与泛型 Stack 类似。
示例:
Stack stack = new Stack();
stack.Push(1);
stack.Push(2);
4. 其他集合类型
SortedList<TKey, TValue>
基于键的升序排列。
提供快速查找、插入和删除操作。
示例:
SortedList<int, string> sortedList = new SortedList<int, string>();
sortedList.Add(1, "apple");
sortedList.Add(3, "banana");
sortedList.Add(2, "cherry");
LinkedList< T >
基于链表实现,提供对元素的高效插入和删除操作。
与 List 不同,LinkedList 不支持按索引访问元素。
示例:
LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(10);
linkedList.AddFirst(5);
linkedList.Remove(10);
5. 并发集合(Concurrent Collections)
定义:并发集合是专门为多线程环境设计的集合类,它们提供线程安全的操作。
常见并发集合:
- ConcurrentQueue
- ConcurrentStack
- ConcurrentDictionary<TKey, TValue>
示例:
ConcurrentDictionary<int, string> concurrentDict = new ConcurrentDictionary<int, string>();
concurrentDict[1] = "apple";
总结
C# 提供了多种集合类型来满足不同场景的需求。泛型集合通常是首选,它们提供类型安全和高效操作。对于需要线程安全的场景,可以使用并发集合。而对于简单的场景,非泛型集合依然有其适用的地方。