C# 集合方法速查表
一、List(动态列表)
| 添加 | list.Add(要添加的元素) | 在末尾添加单个元素 |
| list.AddRange(要批量添加的集合) | 在末尾批量添加多个元素 | |
| list.Insert(插入位置的索引, 要插入的元素) | 在指定索引位置插入元素 | |
| list.InsertRange(插入位置的索引, 要批量插入的集合) | 在指定位置批量插入 | |
| 删除 | list.Remove(要删除的元素) | 删除第一个匹配的元素,返回 bool |
| list.RemoveAt(要删除位置的索引) | 按索引删除元素 | |
| list.RemoveAll(删除条件) | 删除所有满足条件的元素,返回删除数量 | |
| list.RemoveRange(起始索引, 删除数量) | 从指定位置开始删除指定数量的元素 | |
| list.Clear() | 清空所有元素 | |
| 查询 | list.Contains(要查找的元素) | 判断是否包含指定元素 |
| list.IndexOf(要查找的元素) | 查找第一个匹配元素的索引,未找到返回 -1 | |
| list.Find(查找条件) | 按条件查找第一个匹配元素 | |
| list.FindAll(查找条件) | 按条件查找所有匹配元素,返回新 List | |
| list.FindIndex(查找条件) | 按条件查找第一个匹配元素的索引 | |
| list.Exists(判断条件) | 判断是否存在满足条件的元素 | |
| 修改 | list[索引] = 新值 | 通过索引直接修改元素 |
| list.Sort() | 对列表排序 | |
| list.Reverse() | 反转列表元素顺序 |
二、Dictionary<TKey, TValue>(字典/键值对集合)
| 添加 | dict.Add(键, 值) | 添加键值对,键重复时抛出异常 |
| dict[键] = 值 | 添加或更新,键已存在则覆盖值 | |
| dict.TryAdd(键, 值) | 尝试添加,键已存在时不抛异常,返回 bool | |
| 删除 | dict.Remove(要删除的键) | 按键删除,返回 bool |
| dict.Remove(要删除的键, out 被删除的值) | 删除并输出被删除的值(.NET Core 2.0+) | |
| dict.Clear() | 清空所有键值对 | |
| 查询 | dict.ContainsKey(要查找的键) | 判断是否包含指定键 |
| dict.ContainsValue(要查找的值) | 判断是否包含指定值 | |
| dict.TryGetValue(要查找的键, out 获取到的值) | 安全获取值,键不存在时不抛异常 | |
| dict[键] | 通过键获取值,键不存在时抛出异常 | |
| 修改 | dict[键] = 新的值 | 按键修改值(键必须已存在) |
三、HashSet(哈希集合,元素唯一)
| 添加 | set.Add(要添加的元素) | 添加元素,重复时返回 false |
| set.UnionWith(要合并的另一个集合) | 合并另一个集合(并集) | |
| 删除 | set.Remove(要删除的元素) | 删除指定元素 |
| set.RemoveWhere(删除条件) | 删除所有满足条件的元素 | |
| set.Clear() | 清空集合 | |
| 查询 | set.Contains(要查找的元素) | 判断是否包含指定元素 |
| set.Overlaps(另一个集合) | 判断是否与另一集合有交集 | |
| set.SetEquals(另一个集合) | 判断两个集合元素是否完全相同 | |
| 集合运算 | set.IntersectWith(另一个集合) | 取交集(保留两个集合共有的元素) |
| set.ExceptWith(另一个集合) | 取差集(移除另一集合中也存在的元素) | |
| set.SymmetricExceptWith(另一个集合) | 取对称差集(只保留不共有的元素) | |
| set.IsSubsetOf(另一个集合) | 判断是否为子集 | |
| set.IsSupersetOf(另一个集合) | 判断是否为超集 |
四、Queue(队列,先进先出 FIFO)
| 添加 | queue.Enqueue(要入队的元素) | 入队(添加到队尾) |
| 删除 | queue.Dequeue() | 出队(移除并返回队首元素),空时抛异常 |
| queue.TryDequeue(out 出队的元素) | 安全出队,空时返回 false | |
| queue.Clear() | 清空队列 | |
| 查询 | queue.Peek() | 查看队首元素但不移除 |
| queue.TryPeek(out 队首元素) | 安全查看队首元素 | |
| queue.Contains(要查找的元素) | 判断是否包含指定元素 |
五、Stack(栈,后进先出 LIFO)
| 添加 | stack.Push(要入栈的元素) | 入栈(压入栈顶) |
| 删除 | stack.Pop() | 出栈(移除并返回栈顶元素),空时抛异常 |
| stack.TryPop(out 出栈的元素) | 安全出栈,空时返回 false | |
| stack.Clear() | 清空栈 | |
| 查询 | stack.Peek() | 查看栈顶元素但不移除 |
| stack.TryPeek(out 栈顶元素) | 安全查看栈顶元素 | |
| stack.Contains(要查找的元素) | 判断是否包含指定元素 |
六、LinkedList(双向链表)
| 添加 | list.AddLast(要添加的元素) | 在尾部添加 |
| list.AddFirst(要添加的元素) | 在头部添加 | |
| list.AddAfter(参照节点, 要插入的元素) | 在指定节点之后添加 | |
| list.AddBefore(参照节点, 要插入的元素) | 在指定节点之前添加 | |
| 删除 | list.Remove(要删除的元素) | 删除第一个匹配的元素 |
| list.Remove(要删除的节点) | 删除指定节点 | |
| list.RemoveFirst() | 删除头节点 | |
| list.RemoveLast() | 删除尾节点 | |
| list.Clear() | 清空链表 | |
| 查询 | list.Contains(要查找的元素) | 判断是否包含指定元素 |
| list.Find(要查找的元素) | 查找第一个匹配节点,返回 LinkedListNode<T> | |
| list.FindLast(要查找的元素) | 查找最后一个匹配节点 |
七、SortedSet(有序集合)
| 添加 | set.Add(要添加的元素) | 添加元素(自动排序且唯一) |
| 删除 | set.Remove(要删除的元素) | 删除指定元素 |
| set.RemoveWhere(删除条件) | 删除满足条件的元素 | |
| set.Clear() | 清空集合 | |
| 查询 | set.Contains(要查找的元素) | 判断是否包含 |
| set.Min | 获取最小值(属性) | |
| set.Max | 获取最大值(属性) | |
| set.GetViewBetween(范围下限, 范围上限) | 获取指定范围内的子集视图 |
八、通用 LINQ 扩展方法(适用于所有 IEnumerable)
| 筛选 | .Where(筛选条件) | 按条件筛选元素 |
| 投影 | .Select(转换规则) | 将每个元素转换为新形式 |
| 排序 | .OrderBy(排序依据) | 升序排序 |
| .OrderByDescending(排序依据) | 降序排序 | |
| 聚合 | .Count() / .Sum() / .Average() / .Max() / .Min() | 计数、求和、平均值、最大值、最小值 |
| 取值 | .First() / .Last() / .Single() | 取第一个/最后一个/唯一元素(无匹配时抛异常) |
| .FirstOrDefault() / .LastOrDefault() | 安全取值,无匹配时返回默认值 | |
| 转换 | .ToList() / .ToArray() / .ToDictionary() | 转换为 List、数组、Dictionary |
| 去重 | .Distinct() | 去除重复元素 |
| 判断 | .Any(判断条件) | 是否存在满足条件的元素 |
| .All(判断条件) | 是否所有元素都满足条件 |
九、List 与 Dictionary 完整代码示例(已验证可运行)
代码
using System;
using System.Collections.Generic;
using System.Linq;
namespace CollectionDemo
{
// 定义一个学生类
class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Grade { get; set; }
public override string ToString()
{
return $"[学号:{Id}, 姓名:{Name}, 年龄:{Age}, 班级:{Grade}]";
}
}
class Program
{
static void Main(string[] args)
{
var students = new List<Student>
{
new Student { Id = 1, Name = "小明", Age = 19, Grade = "二班" },
new Student { Id = 2, Name = "小红", Age = 19, Grade = "二班" },
new Student { Id = 3, Name = "小刚", Age = 20, Grade = "一班" },
new Student { Id = 4, Name = "小丽", Age = 17, Grade = "三班" },
new Student { Id = 5, Name = "小华", Age = 21, Grade = "二班" },
new Student { Id = 6, Name = "小芳", Age = 18, Grade = "三班" },
new Student { Id = 7, Name = "小强", Age = 22, Grade = "一班" }
};
// 1. 【排序】按年龄升序
students = students.OrderBy(s => s.Age).ToList();
Console.WriteLine("【排序】按年龄升序:");
students.ForEach(s => Console.WriteLine(" " + s.ToString()));
Console.WriteLine();
// 2. 【删除】移除小强 和 所有三班的学生
students.RemoveAll(s => s.Name == "小强" || s.Grade == "三班");
Console.WriteLine("【删除】移除小强和三班学生后:");
students.ForEach(s => Console.WriteLine(" " + s.ToString()));
Console.WriteLine($"\\n当前学生总数:{students.Count}");
Console.WriteLine(new string('-', 30));
// 3. 【增加】添加新学生
students.Add(new Student { Id = 8, Name = "小新", Age = 18, Grade = "四班" });
Console.WriteLine("\\n【增加】添加小新后:");
students.ForEach(s => Console.WriteLine(" " + s.ToString()));
// 4. 【修改】把学号为 1 的学生年龄改为 25,班级改为五班
var stu1 = students.Find(s => s.Id == 1);
if (stu1 != null)
{
stu1.Age = 25;
stu1.Grade = "五班";
}
Console.WriteLine("\\n【修改】学号1的小明修改后:");
Console.WriteLine(" " + stu1.ToString());
// 5. 【查询】查找所有二班的学生
var classTwo = students.Where(s => s.Grade == "二班").ToList();
Console.WriteLine("\\n【查询】所有二班学生:");
classTwo.ForEach(s => Console.WriteLine(" " + s.ToString()));
Console.WriteLine("\\n———————————–");
Console.WriteLine("【Dictionary 字典示例】");
// 6. 【字典】创建学生字典(Key: 学号, Value: 学生对象)
Dictionary<int, Student> studentDict = students.ToDictionary(s => s.Id);
// 添加字典元素
studentDict[9] = new Student { Id = 9, Name = "小美", Age = 20, Grade = "六班" };
// 快速查找(字典通过键查找比 List 效率高得多)
if (studentDict.ContainsKey(2))
{
Console.WriteLine($"\\n通过字典快速查找学号2的学生:{studentDict[2]}");
}
// 遍历字典
Console.WriteLine("\\n遍历字典中所有学生:");
foreach (var kvp in studentDict)
{
Console.WriteLine($" 键(学号): {kvp.Key} => 值(学生): {kvp.Value}");
}
}
}
}
运行结果
【排序】按年龄升序:
[学号:4, 姓名:小丽, 年龄:17, 班级:三班]
[学号:6, 姓名:小芳, 年龄:18, 班级:三班]
[学号:1, 姓名:小明, 年龄:19, 班级:二班]
[学号:2, 姓名:小红, 年龄:19, 班级:二班]
[学号:3, 姓名:小刚, 年龄:20, 班级:一班]
[学号:5, 姓名:小华, 年龄:21, 班级:二班]
[学号:7, 姓名:小强, 年龄:22, 班级:一班]
【删除】移除小强和三班学生后:
[学号:1, 姓名:小明, 年龄:19, 班级:二班]
[学号:2, 姓名:小红, 年龄:19, 班级:二班]
[学号:3, 姓名:小刚, 年龄:20, 班级:一班]
[学号:5, 姓名:小华, 年龄:21, 班级:二班]
当前学生总数:4
——————————
【增加】添加小新后:
[学号:1, 姓名:小明, 年龄:19, 班级:二班]
[学号:2, 姓名:小红, 年龄:19, 班级:二班]
[学号:3, 姓名:小刚, 年龄:20, 班级:一班]
[学号:5, 姓名:小华, 年龄:21, 班级:二班]
[学号:8, 姓名:小新, 年龄:18, 班级:四班]
【修改】学号1的小明修改后:
[学号:1, 姓名:小明, 年龄:25, 班级:五班]
【查询】所有二班学生:
[学号:2, 姓名:小红, 年龄:19, 班级:二班]
[学号:5, 姓名:小华, 年龄:21, 班级:二班]
———————————–
【Dictionary 字典示例】
通过字典快速查找学号2的学生:[学号:2, 姓名:小红, 年龄:19, 班级:二班]
遍历字典中所有学生:
键(学号): 1 => 值(学生): [学号:1, 姓名:小明, 年龄:25, 班级:五班]
键(学号): 2 => 值(学生): [学号:2, 姓名:小红, 年龄:19, 班级:二班]
键(学号): 3 => 值(学生): [学号:3, 姓名:小刚, 年龄:20, 班级:一班]
键(学号): 5 => 值(学生): [学号:5, 姓名:小华, 年龄:21, 班级:二班]
键(学号): 8 => 值(学生): [学号:8, 姓名:小新, 年龄:18, 班级:四班]
键(学号): 9 => 值(学生): [学号:9, 姓名:小美, 年龄:20, 班级:六班]



