初始化SortedDictionary而不进行比较

本文关键字:比较 SortedDictionary 初始化 | 更新日期: 2023-09-27 18:24:55

在我的应用程序中,我有一个SortedDictionary。大多数时候,我在其中插入单个值——在这种情况下,我理解,它需要使用Compare方法来确定新值应该添加到哪里。我只是想知道,是否有某种方法可以在不运行Compare方法的情况下,从KeyValuePair<>[]数组初始化这个SortedDictionary。

问题是,有时我确实有一个KeyValuePair<>[]数组,它包含已经排序的键,因此它可以在SortedDictionary中进行转换,而不需要任何额外的排序。我知道编译器不知道我的集合是排序的,但既然我确信,有没有办法故意逃避比较?如果这个要求完全是无稽之谈,你能解释一下为什么吗?

我想要这样做的唯一原因是因为性能——当处理大型集合时,Compare方法需要一些时间才能完成。

初始化SortedDictionary而不进行比较

[…]我知道编译器不知道我的集合是排序,[…]

排序不是编译时,而是运行时细节。

我认为这不是个好主意。以下是不这么做的原因总结

  • 字典实际上是一个哈希表。因此,键本身并不是按排序的
  • 排序字典要求比较器以任意顺序提供关键字。如果不使用比较器,一个简单的哈希表如何能够按某种顺序公开其键

在一天结束时,当您需要一个顺序为插入顺序的集合时,您应该使用List<T>,在您的情况下,您应该考虑使用List<KeyValuePair<TKey, TValue>>。无论如何,这对你来说是行不通的。您希望提供一个已经排序的序列作为排序字典的源,并在构造时间后添加新对时,让比较器在字典填充后工作。

我想说的是,如果你需要一个排序字典,它依赖于在构建时给定的对序列,并且不能重新排序(因为它们已经排序了),那么你需要考虑滚动你自己的IDictionary<TKey, TValue>实现来提供这样的功能。。。