只找到一个 SortedSet, 想要他按添加顺序排序, 必须给元素包装一下, 添加一个添加序号, 然后再指定一个按此序号排序的比较器, 比如像下面这样, 为了构造一个按添加顺序排序的 string 集合, 写了一堆代码, 实在是太麻烦了
public void SortedSetSortByAddOrder()
{
SortedSet<(int, string)> set = new(new AddComparer())
{
(1, "first"),
(2, "second"),
(3, "third"),
(4, "forth"),
(5, "fifth"),
(6, "sixth")
};
}
public class AddComparer : IComparer<(int, string)>
{
public int Compare((int, string) x, (int, string) y)
{
return x.Item1.CompareTo(y.Item1);
}
}
1
sunmker 2022-09-26 20:58:15 +08:00
貌似没有
|
2
netnr 2022-09-26 21:20:06 +08:00 via Android
声明 两个对象,HashSet List
|
3
thinkershare 2022-09-26 21:33:50 +08:00 1
这样的集合效率必然低下,原生肯定是没有的, 可以自己实现一个, 不过效率嘛, 再怎么优化也不会太高。
|
4
geelaw 2022-09-26 21:42:07 +08:00
没有自带的。Microsoft 目前的 Dictionary 实现是用数组作为节点存储、下标作为指针的链表,数组里的顺序是遍历顺序,删除的时候把节点放入空闲链表,加入的时候优先使用空闲链表,其次使用数组之后的空位,最后考虑扩容。因此,加入 1 、2 、3 ,删除 2 ,加入 4 ,此后遍历顺序是 1 、4 、3 。当然,现在的实现不一定是未来的实现。
你可以仿照这个实现一下自己的 Dictionary ,删除的时候不要放入空闲链表,但要考虑碎片整理(例如有 1/2 空间是碎片的时候整理),加入的时候先考虑数组之后的空位,再考虑碎片整理,最后考虑扩容,以数组顺序作为遍历顺序。删除的时候碎片整理是为了提高均摊效率,当然坏处是删除操作会令所有迭代器无效(最新版本的 Dictionary 里,删除操作不会令迭代器无效)。 |
5
a33291 2022-09-26 21:59:21 +08:00
|
6
FungKao 2022-09-26 22:01:38 +08:00
|
7
huang119412 2022-09-27 09:06:35 +08:00 1
@thinkershare 这样的集合效率必然低下?你是怎么得出这个结论的?从名字看也是 HashSet ,O(1)的查找,效率低? LinkedHashSet 和 SortedSet 根本不是一个类型。SortedSet 和 Hash 比才是效率低下。
|
8
thinkershare 2022-09-27 09:15:02 +08:00
@huang119412 我没有义务告诉你为什么.
|
9
zhady009 2022-09-27 12:29:03 +08:00 via iPhone
@thinkershare enrty 加两个一前一后的属性 维护起来跟链表一样这也叫效率低下?
|
11
bthulu OP |
12
bthulu OP @FungKao 这里面的 IntersectWith 方法实现是有问题的, 可以参考我下面这个
public void IntersectWith(IEnumerable<T> other) { HashSet<T> intersection = other.Where(Contains).ToHashSet(); T[] removed = this.Where(e => !intersection.Contains(e)).ToArray(); foreach (T item in removed) { Remove(item); } } |
13
INCerry 2022-09-27 13:36:59 +08:00
|
14
zmal 2022-09-27 14:29:48 +08:00
3L 的这位,不懂还爱装 X 。'我没有义务告诉你为什么',很久没见过这么爱装 X 的人了。
|
15
zmal 2022-09-27 14:34:38 +08:00
.net 的 SortSet 用红黑树实现的,相当于 Java 里的 TreeMap 、TreeSet 。
LinkedHashSet 相比 HashSet 每个 entry 多维护了两个指针,开销不大。 |