51、c# 请列举出6个集合类及用途
在C#中,集合类提供了多种数据结构来存储和操作一组对象。以下是6个常用的集合类及其用途:
1. List< T >
-
用途:动态数组,用于存储一组有序的对象,支持动态扩容和缩容。
-
特点:
- 可以通过索引直接访问元素。
- 支持添加、删除、插入和查找操作。
- 适用于需要频繁访问和修改元素的场景。
-
示例:
List<string> fruits = new List<string> { "Apple", "Banana", "Orange" };
fruits.Add("Grape"); // 添加元素
string firstFruit = fruits[0]; // 通过索引访问
2. Dictionary<TKey, TValue>
- 用途:键值对集合,用于通过唯一的键快速查找对应的值。
- 特点:
- 键必须是唯一的,值可以重复。
- 查找、添加和删除操作的时间复杂度接近O(1)。
- 适用于需要快速查找的场景,如缓存、配置存储等。
- 示例:
Dictionary<int, string> userIds = new Dictionary<int, string>
{{ 1, "Alice" },{ 2, "Bob" }
};
string name = userIds[1]; // 通过键查找
3. HashSet< T >
- 用途:无序集合,用于存储不重复的元素。
- 特点:
- 自动去重,元素唯一。
- 支持集合操作(如并集、交集、差集)。
- 适用于需要快速判断元素是否存在的场景。
- 示例:
HashSet<int> uniqueNumbers = new HashSet<int> { 1, 2, 3, 3, 4 }; // 自动去重
bool containsThree = uniqueNumbers.Contains(3); // 判断是否存在
4. Queue< T >
- 用途:先进先出(FIFO)队列,用于按顺序处理元素。
- 特点:
- 元素按照添加的顺序排列。
- 支持Enqueue(入队)和Dequeue(出队)操作。
- 适用于任务调度、消息队列等场景。
- 示例:
Queue<string> tasks = new Queue<string>();
tasks.Enqueue("Task1");
tasks.Enqueue("Task2");
string nextTask = tasks.Dequeue(); // 获取并移除队首元素
5. Stack< T >
- 用途:后进先出(LIFO)栈,用于按相反顺序处理元素。
- 特点:
- 元素按照添加的逆序排列。
- 支持Push(压栈)和Pop(弹栈)操作。
- 适用于撤销操作、表达式求值等场景。
- 示例:
Stack<char> brackets = new Stack<char>();
brackets.Push('(');
brackets.Push(')');
char topBracket = brackets.Pop(); // 获取并移除栈顶元素
6. LinkedList< T >
- 用途:双向链表,用于高效地在任意位置插入和删除元素。
- 特点:
- 每个节点包含数据和前后节点的引用。
- 支持在头部、尾部或指定节点后插入/删除元素。
- 适用于需要频繁在中间位置操作的场景。
- 示例:
LinkedList<string> cities = new LinkedList<string>();
LinkedListNode<string> newYork = cities.AddLast("New York");
cities.AddAfter(newYork, "Boston"); // 在指定节点后插入
总结
- List< T > 动态数组,有序存储,适用于频繁访问和修改元素。
- Dictionary<TKey, TValue>键值对存储,快速查找,适用于需要通过键快速访问值的场景。
- HashSet< T >存储不重复元素,适用于需要去重或快速判断元素存在的场景。
- Queue< T >先进先出队列,适用于任务调度、消息队列等。
- Stack< T >后进先出栈,适用于撤销操作、表达式求值等。
- LinkedList< T >双向链表,高效插入/删除,适用于需要频繁在中间位置操作的场景。
根据具体需求选择合适的集合类,可以提高代码的效率和可读性。