📜  C#中SortedList和SortedDictionary之间的区别(1)

📅  最后修改于: 2023-12-03 15:14:30.629000             🧑  作者: Mango

C#中SortedList和SortedDictionary之间的区别

在C#中,SortedList和SortedDictionary是两种常用的有序集合,它们都实现了IDictionary接口,但在实现和使用方面有一些区别。

SortedList

SortedList是一个有序键值对集合,其中键和值都可以为任何类型,但键必须是唯一的且已排序的。通过键可以查找对应的值。

实现

SortedList是基于一个数组实现的,它内部维护一个有序数组,每个元素都是一个键值对结构体。使用二分查找算法可以快速地查找一个指定的键。

优点
  • 下标存取:可以使用类似数组的下标方式访问元素。
  • 快速查找:在查找元素时效率高,因为内部使用了二分查找算法。
  • 排序:所有的元素都是有序的。
缺点
  • 插入和删除元素时效率较低,因为需要对内部数组进行移动。
  • 不适用于大量的数据操作,因为在操作过程中可能需要频繁地移动数组中的元素。
代码示例
// 创建SortedList集合
SortedList<string, int> scores = new SortedList<string, int>();

// 添加元素
scores.Add("张三", 80);
scores.Add("李四", 90);
scores["王五"] = 85;

// 访问元素
Console.WriteLine(scores["张三"]);

// 遍历元素
foreach (KeyValuePair<string, int> score in scores)
{
    Console.WriteLine("{0}: {1}", score.Key, score.Value);
}
SortedDictionary

SortedDictionary也是一个有序键值对集合,与SortedList类似,但SortedDictionary要求键必须是唯一的,但可以是任何类型。与SortedList不同的是,SortedDictionary使用红黑树(一种自平衡二叉搜索树)实现,而不是数组,所以插入和删除元素时效率更高。

实现

SortedDictionary是基于红黑树实现的,所以查找、插入和删除元素时的效率都非常高。

优点
  • 快速查找、插入和删除元素:使用红黑树实现,效率比SortedList更高。
  • 所有元素都是有序的。
缺点
  • 不支持下标存取,必须使用Key或Value属性访问元素。
  • 不适用于大量的数据操作,因为在操作过程中可能需要频繁地重构红黑树的结构,导致效率下降。
代码示例
// 创建SortedDictionary集合
SortedDictionary<string, int> scores = new SortedDictionary<string, int>();

// 添加元素
scores.Add("张三", 80);
scores.Add("李四", 90);
scores["王五"] = 85;

// 访问元素
Console.WriteLine(scores["张三"]);

// 遍历元素
foreach (KeyValuePair<string, int> score in scores)
{
    Console.WriteLine("{0}: {1}", score.Key, score.Value);
}
总结

虽然SortedList和SortedDictionary都是有序集合,但它们的实现方式和使用场景都有所不同。在选择使用时,需要根据具体情况选择合适的集合类型。如果需要频繁地添加、删除元素,而不太在意访问元素的效率,可以选择SortedDictionary;如果需要频繁地访问元素,可以选择SortedList。