C#怎么使用SortedSet有序集_C# SortedSet排序去重教程【技巧】

尼克

尼克

2026-04-20

356人浏览

原创

sortedset底层基于红黑树,插入即有序去重,add()后遍历天然升序;不支持索引访问,依赖icomparer或icomparable排序,频繁增删查且需动态有序时适用。

c#怎么使用sortedset有序集_c# sortedset排序去重教程【技巧】

SortedSet 不是“先加完再排序”,它从插入第一项起就维持有序且去重——所以别用它替代 List + Sort(),否则会多出大量无意义的重复比较和树节点开销。

为什么 Add() 后遍历就是有序的?

SortedSet 底层是红黑树(不是数组或链表),每次 Add() 都按 IComparer<t></t>IComparable<t></t> 定义的顺序插入并自动平衡。这意味着:

  • 插入 5, 1, 3 后调用 foreach,得到的是 1, 3, 5,不是插入顺序
  • 重复添加 3 不会报错,也不会改变集合——Add() 返回 false 表示未新增
  • 没有索引访问(set[0] 会编译失败),只能用 First()Last() 或枚举

自定义排序:IComparer vs 实现 IComparable

默认只支持 intstring 等内置类型;对自定义类,必须显式提供比较逻辑。两种方式效果等价,但适用场景不同:

  • IComparer<t></t>:适合临时、多规则排序,比如按价格升序、按名称降序切换——传入 new PriceComparer()StringComparer.OrdinalIgnoreCase
  • 实现 IComparable<t></t>:适合类型本身有“天然顺序”,比如 Person 按身份证号排序,且该规则稳定不变
  • 注意:如果同时提供了 IComparer<t></t> 构造参数,它会覆盖类型自身的 IComparable<t></t> 实现

示例(按长度排序字符串):

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
var set = new SortedSet<string>(StringComparer.Ordinal); // 错!这是字典序<br>var set = new SortedSet<string>(Comparer<string>.Create((a, b) => a.Length.CompareTo(b.Length)));</string></string></string>

SortedSet 和 HashSet / List 的关键区别

选错类型会导致性能或语义错误:

  • HashSet<t></t>:去重快(O(1) 平均),但不保证顺序;SortedSet<t></t> 插入/查找是 O(log n),空间占用更大(每个元素带左右子节点引用)
  • List<t></t> + Distinct().OrderBy():适合一次性处理、后续只读;而 SortedSet<t></t> 适合频繁增删查且始终需要有序视图
  • 不能用 SortedSet<t></t> 存可变对象(如未重写 GetHashCodeEquals 的 class),否则修改后可能破坏树结构,导致 Contains() 失效或遍历跳项

容易被忽略的边界行为

这些细节常在调试时暴露:

  • RemoveWhere() 是 O(n log n),不是 O(n) —— 因为每删一个都要重新平衡树
  • UnionWith()IntersectWith() 等批量操作,传入的集合类型不影响结果顺序,但若传入未排序的 List<t></t>,内部仍会逐个 Add(),不会“批量建树”
  • null 值:引用类型 T 可为 null,但只有当比较器允许(如 Comparer<string>.Default</string> 支持)才安全;用 StringComparer.Ordinalnull 会被排在最前
  • 不要依赖 SortedSet<t></t> 的枚举顺序做“第 N 小”查询——没有 ElementAt(n),要取中位数得先转 ToList(),这会丢掉 O(log n) 优势

真正需要动态维护有序+去重集合时,SortedSet<t></t> 是少数几个不需自己手写平衡树的选项;但只要数据量小、变更少,或者只需要最终有序,HashSet<t></t> 加一次 OrderBy 往往更轻量、更直观。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1180

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

138

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习