You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# SortedSet<T>自定义比较器行为疑问及排序集合选型咨询

问题解答

1. 这是SortedSet的预期行为吗?

是的,这完全是SortedSet的预期行为。

在.NET的SortedSet实现中,元素的“相等性”判断完全由你提供的自定义IComparer决定——只要比较器对两个元素返回0,SortedSet就会认为它们是重复元素,不会执行Add操作,并且Contains/Remove方法也会基于这个逻辑查找元素,完全忽略元素自身的Equals()和GetHashCode()实现。

文档中提到的“不允许重复元素”,这里的“重复”就是由比较器定义的相等性,而非元素本身的引用或值相等。确实,官方文档在这一点上的描述不够直白,容易让开发者误解比较器仅用于排序而非相等性判断。

2. 符合需求的排序集合推荐

如果你需要一个允许重复元素、同时按指定规则排序的集合,可以根据使用场景选择以下方案:

  • SortedList<TKey, List>:将排序依据的键(比如向量模长)作为TKey,每个键对应一个存储实际元素的List。这种方式可以手动维护有序性,同时容纳相同键的多个元素。需要注意如果元素的键值会动态变化,需要额外处理元素的迁移。
  • List + 自定义排序:先将所有元素加入List,之后调用Sort(IComparer<T>)完成排序;如果需要实时保持有序,可以在添加元素时通过二分查找找到插入位置,直接插入对应索引,避免每次全量排序。
  • 第三方OrderedBag(如PowerCollections库):这个集合原生支持允许重复元素的有序存储,内部基于比较器维护排序逻辑,行为和SortedSet类似但允许重复,完全匹配你的需求。

内容的提问来源于stack exchange,提问作者Wabafet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:58:13