Skip to content

键值对集合

HashTable

HashTable 类表示由 键值对 构成的集合类。

优点

  1. 快速查找和插入:它采用哈希表算法,使得查找和插入操作的平均时间复杂的为O(1),即使在数据量较大的情况下,性能也可以非常好;

  2. 灵活性:它允许存储不同类型的键和值,提供了极大的灵活性;

  3. 多线程安全:可以使用 Hashtable.Synchronized 方法创建一个线程安全的 Hashtable,适合多线程环境;

常见属性

属性作用
Count获取哈希表键值对个数
Keys获取哈希表中的键
Values获取哈希表中的值
C#
var table = new Hashtable()
{
    { "1", "Yibo wang" },
    { "2", 100 },
    { "3", true },
    { "4", new { Name = "Yibo wang", Age = 20 } }
};

var count = table.Count;
var keys = table.Keys;
var values = table.Values;

常见方法

方法描述
Add(key, value)向哈希表添加键值对
Contains(key) / ContainsKey(key)判断哈希表中是否存在指定 key
ContainsValue(value)判断哈希表中是否存在指定 value
Remove(key)从哈希表移除指定 key
Clear()清空哈希表
GetEnumerator()返回一个用于循环访问哈希表的枚举数
Hashtable.Synchronized(hashTable)返回一个线程安全的哈希表
C#
// 判断哈希表是否存在指定key
var res1 = table.Contains("1");
var res2 = table.ContainsKey("4");

table.Remove("2");
table.Clear();

// 返回用于循环访问 Hashtable 的枚举数
var enumerator = table.GetEnumerator();
while (enumerator.MoveNext())
{
  Console.WriteLine($"{enumerator.Key}{enumerator.Value}");
}

// 使用线程安全的 Hashtable,确保在访问期间的线程安全
var syncHashTable = Hashtable.Synchronized(table);
lock (syncHashTable.SyncRoot)
{
  foreach (var entry in syncHashTable)
  {
    Console.WriteLine($"{entry.Key}: {entry.Value}");
  }
}

Lookup

Lookup<TKey, TElement> 是一个集合类型,用于存储键(key)与多个值(TElement)之间的映射关系。

优点

  1. 它通常用于查找具有相同键的多个元素,并且会返回一个键与多个元素关联的集合;
  2. 它会提前将所有的分组数据计算并缓存起来,适合频繁查询分组数据的情况
C#
List<Person> people =
[
  new Person("张三", "一班", 20),
  new Person("李四", "二班", 25),
  new Person("王五", "一班", 30),
  new Person("赵六", "一班", 35),
];

// 按照班级进行映射
var lookup = people.ToLookup(p => p.Class);
foreach (var person in lookup)
{
    Console.WriteLine(person.Key);
    foreach (var item in person)
    {
        Console.WriteLine($"{item.Name} - {item.Class} - {item.Age}");
    }
}
和 GroupBy 的区别

GroupBy 是懒加载的,适合只需要按条件进行分组,但是不会频繁查询分组数据的情况。

C#
// 按照班级进行分组
var dictionary = people.GroupBy(d => d.Class);
foreach (var person in dictionary)
{
  Console.WriteLine(person.Key);
  foreach (var item in person)
  {
    Console.WriteLine($"{item.Name} - {item.Class} - {item.Age}");
  }
}

SortedList

SortedList 是一种集合,它同时具有 Array 和 Hashtable 的特性,存储的是 键值对,并且会**按照键的顺序自动进行排序**。

C#
var sortedList = new SortedList<int, string>();
sortedList.Add(100, "Watermelon");
sortedList.Add(3, "Apple");
sortedList.Add(1, "Banana");
sortedList.Add(2, "Orange");

//获取元素
var res = sortedList[100]; // Watermelon
//移除元素
sortedList.Remove(2);

foreach (var item in sortedList)
{
  Console.WriteLine($"Key = {item.Key}, Value = {item.Value}");
}

Released under the MIT License.