C#中SortedSet的具体使用

2025-08-13 22:50

本文主要是介绍C#中SortedSet的具体使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#中SortedSet的具体使用》SortedSet是.NETFramework4.0引入的一个泛型集合类,它实现了一个自动排序的集合,内部使用红黑树数据结构来维护元素的有序性,下面就来介绍一下如...

基础概念

SortedSet 是 C# 中的一个集合类型,位于 System.Collections.Generic 命名空间下。它是一个自动排序的集合,用于存储不重复的元素,并且会根据元素的自然顺序(默认排序)或自定义比较器进行排序,内部使用红黑树数据结构来维护元素的有序性。

  • 自动排序:每次添加或删除元素时,SortedSet 都会自动调整以保持元素的排序状态。
  • 不重复元素:SortedSet 不允许重复的元素。如果尝试添加一个已经存在的元素,该操作会被忽略。
  • 高效性:SortedSet 内部使用红黑树(一种自平衡二叉搜索树)实现,因此查找、插入和删除操作的时间复杂度为 O(log n)

主要特性

  • 自动保持元素排序:元素会根据其自然顺序(需实现 IComparable<T> 接口)或自定义比较器(IComparer<T>)排序。
  • 不包含重复元素:尝试添加已有元素时,Add 方法返回 false,集合保持不变。
  • 支持集合操作:提供并集、交集、差集等操作。
  • 支持子集视图:可以通过方法获取某个范围内的元素。
  • 快速访问边界值:提供 Min 和 Max 属性,快速获取最小和最大元素。

创建和初始化

基本创建方式

使用默认比较器(升序)

// 使用默认比较器(升序)
SortedSet<int> numbers = new SortedSet<int>();

 使用自定义比较器

// 使用自定义比较器
SortedSet<string> names = new SortedSet<string>(StringComparer.OrdinalIgnoreCase);

从现有集合创建

// 从现有集合创建
int[] array = { 5, 2, 8, 1, 9 };
SortedSet<int> sortedNumbers = new SortedSet<int>(array);
// 结果:{1, 2, 5, 8, 9}

使用集合初始化器

// 使用集合初始化器
SortedSet<string> fruits = new SortedSet<string> { "Apple", "Banana", "Cherry" };

自定义比较器

降序排列

// 降序排列
SortedSet<int> descendingNumbers = new SortedSet<int>(Comparer<int>.Create((x, y) => y.CompareTo(x)));

自定义对象排序

// 自定义对象排序
public class Person : IComparable<Person>
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public int CompareTo(Person other)
    {
        if (other == null) return 1;
        return this.Age.CompareTo(other.Age); // 按年龄排序
    }
}

SortedSet<Person> people = new SortedSet<Person>();

使用自定义比较器

// 或使用自定义比较器
SortedSet<Person> peopleByName = new SortedSet<Person>(
    Comparer<Person>.Create((p1, p2) => string.Compare(p1.Name, p2.Name))
);

基本操作

添加和删除元素

SortedSet<int> numbers = new SortedSet<int>();

添加元素

// 添加元素
bool added1 = numbers.Add(5);    // true,成功添加
bool added2 = numbers.Add(3);    // true,成功添加
bool added3 = numbers.Add(5);    // false,元素已存在

Console.WriteLine(string.Join(", ", numbers)); // 输出:3, 5

删除元素

// 删除元素
bool removed = numbers.Remove(3); // true,成功删除
numbers.Remove(10);  

清空集合

// 清空集合
numbers.Clear();

查询操作

SortedSet<int> numbers = new SortedSet<int> { 1, 3, 5, 7, 9 };

检查元素是否存在

// 检查元素是否存在
bool contains = numbers.Contains(5); // true

获取元素数量

// 获取元素数量
int count = numbers.Count; // 5

检查是否为空

// 检查是否为空
bool isEmpty = numbers.Count == 0; // false

获取最小值和最大值

// 获取最小值和最大值
int min = numbers.Min; // 1
int mawww.chinasem.cnx = numbers.Max; // 9

范围查询

使用 GetViewBetween 方法获取指定范围内的元素子集

SortedSet<int> numbers = new SortedSet<int> { 1, 3, 5, 7, 9, 11, 13 };

// 获取视图(不创建新集合)
SortedSet<int> subset1 = numbers.GetViewBetween(3, 9);
// 结果:{3, 5, 7, 9}

SortedSet<int> subset2 = numbers.GetViewBetween(4, 10);
// 结果:{5, 7, 9}

// 视图会反映原集php合的变化
numbers.Add(6);
Console.WriteLine(string.Join(", ", subset2)); // 输出:5, 6, 7, 9

集合运算

并集、交集、差集

SortedSet<int> set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };
SortedSet<int> set2 = new SortedSet<int> { 4, 5, 6, 7, 8 };

并集:UnionWith 将另一个集合的元素合并到 SortedSet 中。

// 并集(修改 set1)
set1.UnionWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 1, 2, 3, 4, 5, 6, 7, 8

交集:IntersectWith 保留与另一个集合的交集。

// 重新初始化
set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };

// 交集(修改 set1)
set1.IntersectWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 4, 5

差集:ExceptWith 删除与另一个集合相交的元素。

// 重新初始化
set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };

// 差集(set1 中有但 set2 中没有的元素)
set1.ExceptWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 1, 2, 3

对称差集:SymmetricExceptWith 两个集合中不共同拥有的元素

// 对称差集(两个集合中不共同拥有的元素)
set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };
set1.SymmetricExceptWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 1, 2, 3, 6, 7, 8

集合关系判断

SortedSet<int> set1 = new SortedSet<China编程int> { 1, 2, 3 };
SortedSet<int> set2 = new SortedSet<int> { 1, 2, 3, 4, 5 };
SortedSet<int> set3 = new SortedSet<int> { 2, 3 };
SortedSet<int> set4 = new SortedSet<int> { 6, 7 };

子集判断

// 子集判断

bool isSubset = set1.IsSubsetOf(set2);        // true
bool isProperSubset = set1.IsProperSubsetOf(set2); // true
bool isSuperset = set2.IsSupersetOf(set1);    // true
bool isProperSuperset = set2.IsProperSupersetOf(set1); // true

重叠判断

// 重叠判断
bool overlaps = set1.Overlaps(set3);          // true(有共同元素2,3)
bool overlaps2 = set1.Overlaps(set4);         // false(无共同元素)

相等判断

// 相等判断
bool areEqual = set1.SetEquals(set3);         // false

遍历和枚举

基本遍历

SortedSet<string> fruits = new SortedSet<string> { "Banana", "Apple", "Cherry" };

foreach 遍历(按排序顺序)

// phpforeach 遍历(按排序顺序)
foreach (string fruit in fruits)
{
    Console.WriteandroidLine(fruit); // Apple, Banana, Cherry
}

使用枚举器

// 使用枚举器
using (var enumerator = fruits.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        Console.WriteLine(enumerator.Current);
    }
}

反向遍历

SortedSet<int> numbers = new SortedSet<int> { 1, 3, 5, 7, 9 };

// 反向遍历
foreach (int number in numbers.Reverse())
{
    Console.WriteLine(number); // 9, 7, 5, 3, 1
}

SortedSet 的优点和适用场景

优点

  • 自动保持元素排序,无需手动干预。
  • 确保元素唯一性,避免重复。
  • 高效的操作性能(O(log n))。
  • 支持集合操作和子集视图。

适用场景

  • 需要有序且不重复的元素集合,例如排行榜、时间线。
  • 实现优先级队列(尽管 C# 有 PriorityQueue<T>)。
  • 执行集合操作,如并集、交集等。

SortedSet 与其他集合类型的区别

  • 与 HashSet<T> 的区别
    • HashSet<T> 不保持顺序,查找时间为 O(1)。
    • SortedSet<T> 保持顺序,查找时间为 O(log n)。
  • 与 List<T> 的区别
    • List<T> 允许重复元素,不自动排序。
    • SortedSet<T> 不允许重复,自动排序。
  • 与 SortedList<TKey, TValue> 的区别
    • SortedList<TKey, TValue> 是键值对集合,键排序。
    • SortedSet<T> 是元素集合,元素本身排序。

到此这篇关于C#中SortedSet的具体使用的文章就介绍到这了,更多相关C# SortedSet内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)! 

这篇关于C#中SortedSet的具体使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155718

相关文章

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、