键值对集合
HashTable
HashTable 类表示由 键值对 构成的集合类。
优点
快速查找和插入:它采用哈希表算法,使得查找和插入操作的平均时间复杂的为O(1),即使在数据量较大的情况下,性能也可以非常好;
灵活性:它允许存储不同类型的键和值,提供了极大的灵活性;
多线程安全:可以使用
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)之间的映射关系。
优点
- 它通常用于查找具有相同键的多个元素,并且会返回一个键与多个元素关联的集合;
- 它会提前将所有的分组数据计算并缓存起来,适合频繁查询分组数据的情况;
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}");
}