本文以图书管理系统为例,分模块讲解 C# 常用集合,包含概念讲解和示例代码。
1️⃣ Dictionary + List:按分类管理图书
概念讲解
-
Dictionary<TKey, TValue> 是基于哈希表实现的键值对集合。
-
特点:
- 通过键可以快速查找元素(时间复杂度 O(1))。
- 键必须唯一,但值可以重复。
-
适用场景:
- 需要根据某个唯一标识(键)快速访问数据。
- 组织分类数据,例如按类别管理图书。
-
优缺点:
- 优点:查找快、插入和删除效率高。
- 缺点:不保证元素顺序,存储开销相对较大。
示例代码
csharp
using System;
using System.Collections.Generic;
class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Category { get; set; }
public int Stock { get; set; }
public override string ToString()
{
return $"[{Id}] {Title} ({Category}) - 库存: {Stock}";
}
}
class Program
{
static void Main()
{
var books = new List<Book>
{
new Book{Id=1, Title="C# 基础教程", Category="编程", Stock=5},
new Book{Id=2, Title="算法导论", Category="计算机", Stock=3},
new Book{Id=3, Title="数据结构", Category="计算机", Stock=2},
new Book{Id=4, Title="设计模式", Category="编程", Stock=4},
new Book{Id=5, Title="文学名著", Category="文学", Stock=6}
};
Dictionary<string, List<Book>> library = new Dictionary<string, List<Book>>();
foreach (var book in books)
{
if (!library.ContainsKey(book.Category))
library[book.Category] = new List<Book>();
library[book.Category].Add(book);
}
Console.WriteLine("===== 图书按分类显示 =====");
foreach (var category in library.Keys)
{
Console.WriteLine($"类别: {category}");
foreach (var book in library[category])
Console.WriteLine($" {book}");
}
}
}
2️⃣ Stack:最新借阅记录(LIFO)
概念讲解
-
Stack 是后进先出(LIFO)的集合。
-
特点:
Push入栈,Pop出栈。- 最新添加的元素最先被访问。
-
适用场景:
- 保存操作历史(撤销功能)。
- 最近借阅记录。
-
优缺点:
- 优点:操作简单,访问最新元素效率高。
- 缺点:无法随机访问中间元素。
示例代码
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Stack<string> borrowHistory = new Stack<string>();
borrowHistory.Push("C# 基础教程");
borrowHistory.Push("算法导论");
borrowHistory.Push("设计模式");
Console.WriteLine("===== 最新借阅记录 =====");
foreach (var title in borrowHistory)
Console.WriteLine(title);
Console.WriteLine($"\n弹出最新借阅: {borrowHistory.Pop()}");
}
}
3️⃣ Queue:借书排队(FIFO)
概念讲解
-
Queue 是先进先出(FIFO)的集合。
-
特点:
Enqueue入队,Dequeue出队。- 最早添加的元素最先被访问。
-
适用场景:
- 排队处理请求。
- 消息队列、任务调度。
-
优缺点:
- 优点:保证顺序,操作高效。
- 缺点:无法随机访问中间元素。
示例代码
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Queue<string> borrowQueue = new Queue<string>();
borrowQueue.Enqueue("数据结构");
borrowQueue.Enqueue("文学名著");
Console.WriteLine("===== 借书队列 =====");
while (borrowQueue.Count > 0)
{
var book = borrowQueue.Dequeue();
Console.WriteLine($"借出: {book}");
}
}
}
4️⃣ SortedList:统计最畅销图书
概念讲解
-
SortedList<TKey, TValue> 是按键排序的键值对集合。
-
特点:
- 自动按键排序。
- 支持通过键或索引访问。
-
适用场景:
- 排名系统。
- 统计按某个数值排序的数据。
-
优缺点:
- 优点:键有序,查找效率高。
- 缺点:插入和删除操作较慢,键必须唯一。
示例代码
csharp
using System;
using System.Collections;
class Program
{
static void Main()
{
SortedList popularBooks = new SortedList();
popularBooks.Add(10, "C# 基础教程");
popularBooks.Add(15, "算法导论");
popularBooks.Add(8, "设计模式");
Console.WriteLine("===== 最畅销图书 =====");
foreach (DictionaryEntry entry in popularBooks)
Console.WriteLine($"{entry.Value} - 借出次数: {entry.Key}");
}
}
5️⃣ List + LINQ:库存查询与筛选
概念讲解
-
List 是可动态扩展的有序集合。
-
特点:
- 支持索引访问。
- 可以使用 LINQ 快速筛选、排序、聚合。
-
适用场景:
- 动态存储数据。
- 复杂条件筛选。
-
优缺点:
- 优点:操作灵活,功能丰富。
- 缺点:查找特定元素效率低于字典。
示例代码
csharp
using System;
using System.Collections.Generic;
using System.Linq;
class Book
{
public string Title { get; set; }
public int Stock { get; set; }
}
class Program
{
static void Main()
{
var books = new List<Book>
{
new Book{Title="C# 基础教程", Stock=5},
new Book{Title="算法导论", Stock=3},
new Book{Title="数据结构", Stock=2},
new Book{Title="设计模式", Stock=1},
};
var lowStockBooks = books.Where(b => b.Stock <= 2).ToList();
Console.WriteLine("===== 库存不足的图书 =====");
foreach (var book in lowStockBooks)
Console.WriteLine($"{book.Title} - 库存: {book.Stock}");
}
}
🔹 汇总总结
| 集合类型 | 特性 | 使用场景 | 优缺点 |
|---|---|---|---|
| Dictionary<TKey, TValue> | 哈希表,快速查找 | 分类管理图书 | 快查找,顺序不保证 |
| Stack | 后进先出 | 最新借阅记录 | 简单高效,无法随机访问 |
| Queue | 先进先出 | 排队借书 | 保证顺序,无法随机访问 |
| SortedList<TKey, TValue> | 按键排序 | 排名、统计 | 键有序,插入慢 |
| List + LINQ | 动态有序集合 | 筛选、查询、排序 | 灵活,查找慢 |
通过概念 + 示例 + 使用说明的方式,你可以清楚理解每种集合的特性、适用场景和实际用法,并能结合业务逻辑灵活选择集合类型。