为什么有两种 SortedList?

3

我有一个快速应用程序需要使用SortedList。由于我没有经常使用它,所以我进行了一些研究,以确保我知道我在做什么,结果发现似乎有两个版本。还是说有一个带有附加功能的SortedList?你会发现一个版本在System.Collections中,另一个版本在System.Collections.Generic中。

System.Collections.SortedList slist1 = new SortedList();
System.Collections.Generic.SortedList<string, object> slist2 = new SortedList<string, object>();

它们在许多方面都有所不同。slist1有一个SetByIndex方法,而slist2没有。

那么,为什么会有两个版本的SortedList呢?如何更新通用SortedList中对象的值呢?


这些是通用和非通用版本。非通用版本是在框架引入泛型之前的旧版本,主要是为了向后兼容而保留的。 - Rahul
非泛型版本早于C#引入泛型的时期。 - 15ee8f99-57ff-4f92-890c-b56153
@Rahul,我想那就是我说的,是的。 - Cyberherbalist
是的,我还在写评论..请查看更新后的评论。 - Rahul
@Rahul,哈哈,明白了。 - Cyberherbalist
顺便提一下,除了通用的 SortedList<TKey, TValue> 之外,还有一个通用的 SortedDictionary<TKey, Value>。它们仅在内部实现上有所不同(因此时间/空间复杂度也不同)。 - Ivan Stoev
3个回答

5

非泛型类 - System.Collections.SortedList - 是在.NET早期创建的类之一,此时还未添加泛型。

这是该命名空间中大多数(如果不是全部)类的源头,至少对于那些有泛型替代品的类来说是如此。

泛型版本是后来添加的,当时或者之后添加的,通常现在是首选的数据结构。

  • System.Collections.SortedList 回溯到 .NET 1.1
  • System.Collections.Generic.SortedList<..> 添加于 .NET 2.0

3

System.Collections.SortedList是早期的.NET 1.1版本,它是在泛型支持之前发布的。应该使用.NET 2.0引入的System.Collections.Generic.SortedList<TKey, TValue>代替它。

可以将它们视为System.Collections.ArrayListSystem.Collections.Generic.List<TValue>的等效物。

要更新泛型版本,需要使用索引器

slist2["SomeKeyString"] = newValue;

如果您想通过数字索引查找,请使用Keys属性获取键。

slist2[slist2.Keys[2]] = newValue;

注意:这可能会导致性能比非泛型版本变差,因为 TValue this[TKey index] 需要执行二进制搜索来查找,而 SetByIndex 可以直接访问数组。
最后一点,只有在您需要枚举列表并需要保持顺序时,SortedList<Tkey,TValue> 才真正有用。如果在 foreach 中的顺序不重要,请改用 Dictionary<TKey, TValue>,这样可以获得更快的插入和查找。

没错,这就是我想使用 SortedList 的原因:我需要保持项目的顺序。 - Cyberherbalist
1
@IvanStoev 向你展示了我多么经常使用 SortedList,我已将那部分从我的回答中删除。 - Scott Chamberlain
@IvanStoev 更新了我的答案,现在它可以工作了。你需要从“Keys”中获取密钥,然后在普通索引器上使用它。 - Scott Chamberlain

2

System.Collections.SortedList 是 .NET 1.1 版本中的内容,在泛型类出现之前就有了。由于可能会使用更新的框架版本重新编译旧代码,因此仍然存在。

要更新泛型SortedList中对象的值,请按以下步骤操作:

myGenericSortedList["key"] = "value";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接