现在位置: 首页 > C# 教程 > 正文

C# 排序列表(SortedList)

C# 集合 C# 集合

在 C# 中,排序列表(SortedList) 是一种按键自动排序的集合,它通过键值对存储数据,并在添加或更新时根据键的顺序(升序)自动排序。

SortedList 类代表了一系列按照键来排序的 key => value 对,这些键值对可以通过键和索引来访问。

排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。

SortedList 有两种版本:

  1. 非泛型 SortedListSystem.Collections.SortedList
  2. 泛型 SortedList<TKey, TValue>System.Collections.Generic.SortedList<TKey, TValue>

特点:

  • 自动排序:所有键都按照升序排序,无需手动调用排序方法。
  • 键值对存储:每个键都唯一,与其关联的值可以重复。
  • 动态调整容量:根据需要自动调整内部存储的大小。
  • 索引访问:通过键或索引访问数据。
  • 高效操作:检索、插入、删除的平均时间复杂度为 O(log n)。

SortedList 类的方法和属性

下表列出了 SortedList 类的一些常用的 属性

属性名称类型描述
Countint获取排序列表中键值对的数量。
Capacityint获取或设置排序列表的容量。
ComparerIComparerIComparer<TKey>获取用于对键进行排序的比较器。
IsReadOnlybool指示排序列表是否为只读。
IsFixedSizebool指示排序列表是否具有固定大小(始终为 false)。
KeysICollectionIList<TKey>获取排序列表中的所有键。
ValuesICollectionIList<TValue>获取排序列表中的所有值。

下表列出了 SortedList 类的一些常用的 方法

方法名称返回类型描述
添加与移除
Add(TKey key, TValue value)void将指定的键值对添加到排序列表。
Remove(TKey key)bool从排序列表中移除具有指定键的元素。
RemoveAt(int index)void移除排序列表中指定索引位置的键值对。
Clear()void移除排序列表中的所有元素。
查找与访问
ContainsKey(TKey key)bool确定排序列表是否包含指定的键。
ContainsValue(TValue value)bool确定排序列表是否包含指定的值。
IndexOfKey(TKey key)int返回指定键的索引。
IndexOfValue(TValue value)int返回指定值的索引。
TryGetValue(TKey key, out TValue value)bool获取与指定键相关联的值,如果存在则返回 true
复制与枚举
CopyTo(Array array, int index)void将排序列表中的元素复制到数组,从指定索引开始。
GetEnumerator()IEnumerator返回一个枚举器,用于循环访问排序列表中的元素。

实例

下面的实例演示了排序列表(SortedList)的概念。

非泛型版操作:

实例

using System;
using System.Collections;

namespace CollectionsApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         SortedList sl = new SortedList();

         sl.Add("001", "Zara Ali");
         sl.Add("002", "Abida Rehman");
         sl.Add("003", "Joe Holzner");
         sl.Add("004", "Mausam Benazir Nur");
         sl.Add("005", "M. Amlan");
         sl.Add("006", "M. Arif");
         sl.Add("007", "Ritesh Saikia");

         if (sl.ContainsValue("Nuha Ali"))
         {
            Console.WriteLine("This student name is already in the list");
         }
         else
         {
            sl.Add("008", "Nuha Ali");
         }

         // 获取键的集合
         ICollection key = sl.Keys;

         foreach (string k in key)
         {
            Console.WriteLine(k + ": " + sl[k]);
         }
      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

001: Zara Ali
002: Abida Rehman
003: Joe Holzner
004: Mausam Banazir Nur
005: M. Amlan 
006: M. Arif
007: Ritesh Saikia
008: Nuha Ali

泛型版:

实例

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 创建泛型 SortedList
        SortedList<int, string> sortedList = new SortedList<int, string>();

        // 添加键值对
        sortedList.Add(2, "Banana");
        sortedList.Add(1, "Apple");
        sortedList.Add(3, "Cherry");

        // 自动按键排序
        Console.WriteLine("SortedList contents:");
        foreach (var kvp in sortedList)
        {
            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
        }

        // 查找与访问
        Console.WriteLine($"\nValue for key 2: {sortedList[2]}"); // 输出:Banana

        // 删除元素
        sortedList.Remove(1);
        Console.WriteLine("\nAfter removing key 1:");
        foreach (var kvp in sortedList)
        {
            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
        }

        // 检查键与值
        Console.WriteLine($"\nContains key 3: {sortedList.ContainsKey(3)}"); // 输出:True
        Console.WriteLine($"Contains value 'Apple': {sortedList.ContainsValue("Apple")}"); // 输出:False
    }
}

C# 集合 C# 集合