自学内容网 自学内容网

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)

定义:并发集合是专门为多线程环境设计的集合类,它们提供线程安全的操作。
常见并发集合:

  1. ConcurrentQueue
  2. ConcurrentStack
  3. ConcurrentDictionary<TKey, TValue>

示例:

ConcurrentDictionary<int, string> concurrentDict = new ConcurrentDictionary<int, string>();
concurrentDict[1] = "apple";

总结

C# 提供了多种集合类型来满足不同场景的需求。泛型集合通常是首选,它们提供类型安全和高效操作。对于需要线程安全的场景,可以使用并发集合。而对于简单的场景,非泛型集合依然有其适用的地方。


原文地址:https://blog.csdn.net/liuchunyu0130/article/details/143586024

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!