1、概念 集合(Collection)
集合(Collections)是一组相关的对象,通常被用来存储和管理一组数据。提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。
集合提供了一种比数组更加灵活和强大的数据管理方式,因为通常提供了更多功能,比如动态调整大小、搜索、排序等。
你去超市购物,会推一辆购物车。在这个比喻中,购物车就是一个集合,它可以容纳各种各样的商品(对象)。当你在超市里走动时,你可以随时往购物车里添加商品(添加元素),也可以从购物车里取出商品(移除元素)。如果你发现购物车里的商品太多了,你可以决定不再购买某些商品,然后把它们放回货架上(删除元素)。这就是说的增,减,改,查里的几项。
现在,让我们将这个比喻应用到C#中的集合:
-
List<T>:这是一个非常常用的集合类型,可以看作一个可调整大小的数组。就像购物车一样,你可以随时添加或移除商品。
List<T>
允许你存储任何类型的对象,并且可以根据需要动态增长,它还提供了许多有用的方法来操作列表中的元素。 -
Dictionary<TKey, TValue>:这个集合类型类似于一个字典或电话簿,它存储键值对。在购物车的比喻中,你可以想象每件商品都有一个独特的标签(键),这样你就可以快速找到对应的商品(值)。
Dictionary<TKey, TValue>
允许你通过键快速查找值,这在需要高效查找数据的场景中非常有用。 -
Queue<T>:队列是一种先进先出(FIFO)的数据结构,就像你在超市收银台排队结账一样。最先进入队列的人(元素)会最先离开。
Queue<T>
常用于模拟现实世界中的排队情况,比如任务调度或者消息传递。 -
Stack<T>:栈是一种后进先出(LIFO)的数据结构,就像一堆盘子,你只能从顶部取盘子或者放盘子。最后放上去的盘子会最先被拿走。
Stack<T>
常用于撤销操作、表达式求值等场景。 -
HashSet<T>:这个集合类型类似于一个没有重复元素的列表,就像你不会在购物车里放两个完全相同的商品一样。
HashSet<T>
不允许重复元素,它提供了快速的查找和添加操作,非常适合于需要唯一性的场景。
这些集合类型都是泛型的,意味着你可以指定集合中元素的具体类型,这样可以获得更好的类型安全性和性能。C#中的集合就像是编程世界里的购物车、字典、队列、栈和集合,高效地管理和操作数据。通过选择合适的集合类型,让程序更加健壮和高效。
2、简单例子说明
通过一些简单的例子来说明C#中几种常见的集合类型:List<T>
、Dictionary<TKey, TValue>
、Queue<T>
、Stack<T>
和HashSet<T>
。
List<T>
List<T>
是一个动态数组,它可以存储任意类型的对象,并且可以根据需要自动调整大小。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个List<int>
List<int> numbers = new List<int>();
// 添加元素
numbers.Add(5);
numbers.Add(10);
numbers.Add(15);
// 遍历并打印元素
foreach (var number in numbers)
{
Console.WriteLine(number);
}
// 移除元素
numbers.Remove(10);
// 再次遍历并打印元素
foreach (var number in numbers)
{
Console.WriteLine(number);
}
}
}
Dictionary<TKey, TValue>
是一个键值对的集合,它允许你通过键快速查找值。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个Dictionary<string, int>
Dictionary<string, int> ages = new Dictionary<string, int>();
// 添加键值对
ages.Add("Alice", 30);
ages.Add("Bob", 25);
ages.Add("Charlie", 35);
// 通过键查找值
Console.WriteLine("Alice's age: " + ages["Alice"]);
// 移除键值对
ages.Remove("Bob");
// 检查是否包含某个键
if (!ages.ContainsKey("Bob"))
{
Console.WriteLine("Bob's age is not found.");
}
}
}
Queue<T>
是一个先进先出的集合,常用于模拟排队的情况。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个Queue<string>
Queue<string> queue = new Queue<string>();
// 入队
queue.Enqueue("First");
queue.Enqueue("Second");
queue.Enqueue("Third");
// 出队并打印
while (queue.Count > 0)
{
Console.WriteLine(queue.Dequeue());
}
}
}
Stack<T>
是一个后进先出的集合,常用于模拟堆栈的情况。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个Stack<string>
Stack<string> stack = new Stack<string>();
// 压栈
stack.Push("Bottom");
stack.Push("Middle");
stack.Push("Top");
// 弹栈并打印
while (stack.Count > 0)
{
Console.WriteLine(stack.Pop());
}
}
}
HashSet<T>
是一个无序的集合,它不允许重复的元素。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个HashSet<int>
HashSet<int> uniqueNumbers = new HashSet<int>();
// 添加元素
uniqueNumbers.Add(5);
uniqueNumbers.Add(10);
uniqueNumbers.Add(5); // 重复的元素不会被添加
// 遍历并打印元素
foreach (var number in uniqueNumbers)
{
Console.WriteLine(number);
}
}
}