C# 中的 HybridDictionary 类

2024年8月29日 | 23 分钟阅读

C# 中 "System.Collections.Specialized" 命名空间中的 HybridDictionary 类提供了一种混合数据结构,它结合了列表和字典的特性。

HybridDictionary 类是 .NET Framework 的一部分,提供了一种灵活的数据结构,用于存储键值对。这种数据结构被称为混合结构,因为它会根据集合中元素的数量,在基于字典和基于列表的实现之间进行内部切换。

HybridDictionary 努力使其 哈希表 达到最大化。数据结构哈希表和链表在哈希表中实现。实现 IDictionary 时,大型集合使用 Hashtable,小型集合使用 ListDictionary

HybridDictionary 的主要特性

C# 中的 HybridDictionary 有几个主要特性。一些主要特性如下:

1. 动态行为

对于少量元素,HybridDictionary 将键值对存储在 基本列表 中。

随着集合的增长,它会自动切换到 基于哈希表 的字典,以优化性能。

2. 键值对

它允许我们像普通字典一样使用键值对来存储和检索数据。

3. 顺序维护

与传统字典不同,HybridDictionary 维护元素的插入顺序,使其适用于元素顺序重要的场景。

4. 对小集合高效

基于列表的表示对小集合更节省内存,避免了与哈希表相关的开销。

5. 用于大集合的哈希表

随着集合中元素数量的增长,HybridDictionary 会切换到使用哈希表,为更大的数据集提供更快的查找时间。

HybridDictionary 的用例

C# 中的 HybridDictionary 有几个用例。一些用例如下:

1. 动态数据集

它适用于集合大小事先未知且可变的场景。

2. 平衡内存和性能

它适用于内存使用和查找性能之间的平衡至关重要的场景。

3. 列表和哈希表的组合

它结合了简单列表和哈希表的优点,适应数据集的特性。

HybridDictionary 类的属性

C# 中的 HybridDictionary 有几个属性。一些属性如下:

1. Count

它获取 HybridDictionary 包含的 键值对 的数量。

C# 中 HybridDictionary 类的 Count 属性可用于获取 Dictionary 中键值对的数量。HybridDictionary 中元素的数量以 整数 形式返回。此属性是提供 Dictionary 状态信息的标准属性集的一部分。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中 HybridDictionaryCount 属性。

输出

The number of elements in the HybridDictionary is: 4

说明

在此示例中,使用 Count 属性获取 HybridDictionary 中键值对的数量。添加四个键值对后,number_Of_Elements 变量将被设置为 4

2. IsFixedSize

C# HybridDictionary 类有一个布尔属性 IsFixedSize,它确定 HybridDictionary 的大小是否 固定。当 IsFixedSize 返回 true 时,表示一旦 HybridDictionary 创建,其大小就不能更改。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中 HybridDictionaryIsFixedSize 属性。

输出

Is the HybridDictionary fixed size? False

说明

在此示例中,使用 IsFixedSize 属性确定 HybridDictionary 的固定大小。如果属性返回 true,任何添加或删除字典元素的尝试都将导致 NotSupportedException。在此示例中,在检查 IsFixedSize 属性后,尝试添加新的键值对会引发异常。

3. IsReadOnly

C# 中 HybridDictionary 类的 IsReadOnly 属性是一个布尔属性,指示 HybridDictionary 是否只读。如果 IsReadOnly 返回 true,则 HybridDictionary 无法修改(无法添加、删除或修改元素)。

语法

它具有以下语法:

bool isReadOnly = hybridDictionary.IsReadOnly;

示例

让我们举一个例子来说明 C# 中 HybridDictionaryIsReadOnly 属性。

输出

Is the HybridDictionary read-only? False

说明

为了确定 HybridDictionary 是否只读,此示例中使用了 IsReadOnly 属性。如果属性返回 true,尝试修改 Dictionary(例如,添加新的键值对)将导致 NotSupportedException。在验证 IsReadOnly 属性后,尝试添加新的键值对会导致异常。

4. IsSynchronized

C# 中 HybridDictionary 类的 IsSynchronized 属性是一个 布尔属性,指示对 HybridDictionary 的访问是否同步 (线程安全)。如果 IsSynchronized 返回 true,则表示 HybridDictionary 设计用于多线程环境中的安全使用,并且对其方法和属性的访问是同步的,以确保在多个线程同时访问或修改 Dictionary 时行为正确。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中 HybridDictionaryIsSynchronized 属性。

输出

Is the HybridDictionary synchronized? False
Warning: The HybridDictionary is not synchronized. Manual synchronization may be required.

说明

在此示例中,HybridDictionary 设计用于 同步 访问,并且可以使用 IsSynchronized 属性来确定。如果 IsSynchronized 返回 true,则 Dictionary 在多线程环境中是安全的。在这种情况下,我们通常使用 SyncRoot 属性来获取一个对象,该对象可以用作同步点,以便从多个线程访问或修改 Dictionary。

5. Keys

C# 中 HybridDictionary 类的 Keys 属性可用于检索包含 HybridDictionary 中存储的键的集合。此属性返回一个包含所有键的 ICollection,并且集合中的键按照它们添加到 Dictionary 的顺序排列。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中 HybridDictionaryKeys 属性。

输出

Keys in the HybridDictionary are:
Mango
Apple
Orange

说明

在此示例中,创建了一个 HybridDictionary,填充了 键值对,并使用 Keys 属性 获取了一组键。每个键都使用 foreach 循环 打印到控制台并迭代。

6. Values

C# 中 HybridDictionary 类的 Value 属性用于收集存储在 Dictionary 中的值。值按添加到 HybridDictionary 的顺序返回,集合是包含所有值的 ICollection。此属性提供了一种 迭代 值或对值执行操作的方法,而无需直接修改 Dictionary。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中 HybridDictionaryValues 属性。

输出

Values in the HybridDictionary are:
1
2
3

说明

在此示例中,hybridDict.Values 以 ICollection 的形式返回添加到 HybridDictionary 中的值 (1, 2, 3)。之后,使用 foreach 循环迭代并打印值到终端。

7. SyncRoot

为了在多个线程可能同时访问或修改 Dictionary 时确保线程安全,C# 中的 HybridDictionary 类具有一个 SyncRoot 属性,可用于获取一个对象,该对象可以用作同步点。SyncRoot 属性返回一个对象,该对象可以与 lock 语句一起使用,以同步对 HybridDictionary 的访问。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中 HybridDictionarySyncRoot 属性。

输出

Accessing HybridDictionary in a thread-safe manner.
one: 1
two: 2
three: 3

说明

此示例演示如何使用 hybridDict.SyncRoot 获取一个可用作同步点 的对象 (syncRoot)。之后,lock 语句与此同步对象一起使用,以确保一次只有一个线程可以访问或修改 HybridDictionary。

8. Item [索引器]

C# 中 HybridDictionary 的 Item 属性用于访问或修改 Dictionary 中与特定键关联的值,也称为索引器。使用 方括号表示法,它提供了一种方便的方式来获取或设置与键关联的值。

语法

它具有以下语法

示例

让我们举一个例子来说明 C# 中 HybridDictionaryItem 属性。

输出

Value for key 'two': 2
Updated HybridDictionary:
one: 1
two: 2
three: 3
four: 4

说明

在此示例中,Item 属性用于获取与键 "two" 关联的值,并为 HybridDictionary 中的键 "four" 设置一个新值。之后,程序遍历 Dictionary 以显示更新后的内容。

HybridDictionary 类中的构造函数

HybridDictionary 类中有 四种类型 的构造函数。

  1. HybridDictionary() 构造函数
  2. HybridDictionary(Boolean) 构造函数
  3. HybridDictionary(Int32) 构造函数
  4. HybridDictionary(Int32, Boolean) 构造函数

1. HybridDictionary() 构造函数

HybridDictionary 类旨在提供 哈希表列表性能 特性之间的平衡,使其适用于集合大小可能随时间变化的场景。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中的 HybridDictionary() 构造函数。

输出

Key-Value pairs in HybridDictionary:
Key: key1, Value: value1
Key: key2, Value: value2

说明

a. Using 指令

代码首先使用 using 指令导入所需的命名空间。此代码中包含 System、System.CollectionsSystem.Collections.Specialized

b. 类声明

声明 Demo 类。

c. Main 方法

Main 方法是程序的入口点。

d. HybridDictionary 初始化

HybridDictionary 的默认构造函数用于生成名为 hybrid_Dictionary 的实例:HybridDictionary hybrid_Dictionary = new HybridDictionary();

e. 添加键值对

使用 Add 方法,将两个键值对添加到 hybrid_Dictionary。

f. 访问值

可以使用索引器表示法检索与键 "key2" 关联的值:string valueForKey2 = (string)hybrid_Dictionary["key2"];

g. 显示值

程序使用 foreach 循环遍历 hybrid_Dictionary,同时向控制台打印消息。它将每个条目的键和值打印到控制台。

2. HybridDictionary(Boolean) 构造函数

HybridDictionary 类通常位于 "System.Collections.Specialized" 命名空间中,提供了一种字典实现,该实现根据集合大小调整其内部数据结构。此假设场景中引入了 HybridDictionary(Boolean) 构造函数,允许开发人员自定义字典的行为。

语法

它具有以下语法:

参数

Boolean: 一个布尔参数,指定首选的内部实现方法。当设置为 false 时,Dictionary 可以选择基于列表的方法,当设置为 true 时,优先选择基于哈希表的方法。

示例

让我们举一个例子来说明 C# 中的 HybridDictionary(Boolean) 构造函数。

输出

Key: key1, Value: value1
Key: key2, Value: value2

说明

  1. 创建了一个 HybridDictionary 实例,布尔参数设置为 false。HybridDictionary hybrid_Dictionary = new HybridDictionary(false); 这可能表明 Dictionary 倾向于对较小的集合使用基于列表的方法。
  2. 使用 Add 方法,将键值对添加到 hybrid_Dictionary
  3. 使用索引器表示法检索与键 "key2" 关联的值:string valueForKey2 = (string)hybrid_Dictionary["key2"];
  4. 之后,代码使用 foreach 循环遍历 Dictionary,显示每个键值对。

3. HybridDictionary(Int32) 构造函数

HybridDictionary 类提供的字典实现通常位于 "System.Collections.Specialized" 命名空间中,该实现根据集合大小调整其内部数据结构。此假设场景中引入了 HybridDictionary(Int32) 构造函数,允许开发人员为字典设置初始容量。

语法

它具有以下语法:

参数

Int32: 一个整数参数,指示 HybridDictionary 的所需起始容量。

示例

让我们举一个例子来说明 C# 中的 HybridDictionary(Int32) 构造函数。

输出

Key: key1, Value: value1
Key: key2, Value: value2

说明

在此假设示例中,HybridDictionary(Int32) 构造函数用于创建具有初始容量 10 的 HybridDictionary 实例。当开发人员知道字典的预期大小时,这可能是有利的,因为它可能减少重新分配的次数并可能提高性能。

4. HybridDictionary(Int32, Boolean) 构造函数

在假设场景中,引入了 HybridDictionary(Int32, Boolean) 构造函数,它可能被设计为允许开发人员同时指定初始容量和影响 HybridDictionary 内部行为的布尔参数。

语法

它具有以下语法:

参数

Int32: 一个 整数 参数,指示 HybridDictionary 的所需初始容量。此值指示字典在不重新分配的情况下最初可以容纳的键值对的数量。

Boolean: 一个 布尔 参数,影响内部实现计划。当设置为 false 时,字典可以选择基于列表的方法;否则,当设置为 true 时,它可能优先选择基于哈希表的方法。

示例

让我们举一个例子来说明 C# 中的 HybridDictionary(Int32, Boolean) 构造函数。

输出

Key: key1, Value: value1
Key: key2, Value: value2

说明

在此示例中,HybridDictionary(10, true) 构造函数用于创建具有初始容量 10 且布尔参数设置为 true 的 HybridDictionary 实例。

布尔参数可能与内部大小阈值相关联。例如,如果字典中键值对的数量低于特定阈值,则可以使用基于列表的方法。如果不是,则可以使用基于哈希表的方法。

HybridDictionary 类的方法

C# 中的 HybridDictionary 类有几种方法。HybridDictionary 类的一些主要方法如下:

1. Add()

HybridDictionary 类的 add 函数用于向字典添加具有给定键和值的元素。

语法

它具有以下语法:

参数

key: 它是要添加到字典中的元素的键。

value: 它是要添加到字典中的元素的值。

返回值

void: Add 函数不返回任何值。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 add() 函数

输出

The total key/value pairs in myDict are: 4
The key/value pairs in myDict are: 
1 --> Apple
2 --> Banana
3 --> Orange
4 --> Guava

说明

程序创建一个 HybridDictionary,添加一些键值对,打印总对数,然后显示字典中的每个键值对。

2. Contains()

C# 中的 HybridDictionary 类有一个 Contains 方法,用于确定字典中是否存在给定键。它旨在确定 HybridDictionary 中是否存在具有给定键的元素。

语法

它具有以下语法:

参数

key: 它是在 HybridDictionary 中定位的键。

返回值

bool: 如果 HybridDictionary 中存在具有给定键的元素,则返回 true;否则返回 false。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 contains() 函数

输出

Does the HybridDictionary contain Key1? True
Does the HybridDictionary contain Key3? False

说明

本质上,该程序演示了如何创建一个 HybridDictionary,向其中添加键值对,然后使用 Contains 方法 检查是否存在某些键。输出指示键是否存在于字典中。

3. Equals()

C# 中的 HybridDictionary 类在其自身上有一个指定的 Equals 方法。它从 Object 类继承 Equals 方法,Object 类是 C# 中所有类型的基础类。为了检查引用相等性,"Object.Equals" 方法比较两个对象引用是否指向相同的内存地址。

语法

它具有以下语法:

参数

obj: 要与当前对象进行比较的对象。

返回值

bool: 如果当前对象和提供的对象相等,则返回 true;否则返回 false。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 equals() 函数

输出

Reference equality: False
Content equality: True

说明

上述程序中的 DictionaryEquals 是一个自定义方法,它检查两个 HybridDictionary 实例是否具有相同的内容。此方法比较键值对,而不是比较引用。

4. GetHashCode()

C# 中的 HybridDictionary 类不直接公开 GetHashCode() 方法。但是,它从 Object 类继承 GetHashCode() 方法,Object 类是 C# 中所有类型的基础类。"Object.GetHashCode()" 方法获取当前对象的哈希码。Object 提供的默认实现基于对象的引用。

GetHashCode() 的默认行为是返回一个表示对象内存地址的整数。

语法

它具有以下语法:

返回值

int: 它具有 32 位带符号整数哈希码。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 GetHashCode() 函数

输出

HashCode of dict1: -1710425844
HashCode of dict2: -1323148927
Are hash codes equal? False

说明

默认情况下,GetHashCode() 方法返回一个表示对象内存地址的整数。具有相同值但不同引用的两个对象通常必须具有不同的哈希码。

5. Clear()

C# 中 HybridDictionary 类中的 Clear() 方法从混合字典中删除所有元素,有效地将其重置为空状态。

语法

它具有以下语法:

参数

void: HybridDictionary 类的 Clear() 方法是 void,这意味着它不返回任何值。

Clear(): 调用后,混合字典变为空,因为所有键值对都已删除。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 Clear() 函数

输出

Elements before Clear():
Key: 1, Value: Apple
Key: 2, Value: Banana
Key: 3, Value: Orange
Elements after Clear():

说明

在此示例中,使用 Clear() 方法 清除 HybridDictionary 的所有元素。如果我们想从空集合开始并重置字典,这很有用。请记住,当我们使用 Clear() 时,字典中将留下零个元素。

6. CopyTo(Array, Int32)

C# 中的 HybridDictionary 类有一个 CopyTo(Array, Int32) 方法,它将 HybridDictionary 的元素复制到一维数组中,从数组中指定索引处开始。此方法通常用于将 HybridDictionary 元素传输到另一个数组以进行进一步处理或操作。

语法

它具有以下语法:

参数

array: 一维数组,HybridDictionary 中复制元素的目的是它。数组需要从零开始的索引。

index: 数组中开始复制的从零开始的索引。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 CopyTo(Array, Int 32) 函数

输出

1 --> Apple
2 --> Banana
3 --> Orange

说明

代码添加键值对,将其元素复制到 DictionaryEntry 数组 中,然后从数组中显示键值对,以演示如何使用 HybridDictionary。

7. GetEnumerator()

通过调用 C# HybridDictionary 类中的 GetEnumerator() 方法,可以获得一个 枚举器,该枚举器遍历 HybridDictionary 中的键值对。此方法返回一个 IDictionaryEnumerator 接口,允许它以仅向前、只读的方式遍历字典的元素。

语法

返回值

IDictionaryEnumerator: 它表示键值对集合的枚举器。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 GetEnumerator() 函数

输出

Key-Value pairs in the HybridDictionary:
Key: 1, Value: Apple
Key: 2, Value: Banana
Key: 3, Value: Orange

说明

代码演示了如何创建 HybridDictionary、添加键值对、使用 GetEnumerator() 获取枚举器、使用枚举器遍历键值对,并将输出显示在控制台上。这是一个简单的示例,说明如何使用其枚举器访问和处理 HybridDictionary 的元素。

8. Remove(Object)

使用 C# 中的 remove(Object) 方法 DictionaryridDictionary 类从字典中删除具有特定键的元素。如果字典找不到该键,则该方法无效。

语法

它具有以下语法:

参数

key: 它是用于从 HybridDictionary 中删除的元素的键。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 remove() 函数

输出

Elements before removal:
Key: 1, Value: Mango
Key: 2, Value: Banana
Key: 3, Value: Orange
Elements after removal:
Key: 1, Value: Mango
Key: 3, Value: Orange

说明

代码演示了如何创建 HybridDictionary、添加键值对、删除具有特定键的项,然后显示删除前后的元素。输出将演示从字典中有效删除与键 2 关联的键值对。

9. GetType()

GetType() 方法派生自 "System.Object" 类,它是所有 C# 类型的基础类,并且不是 C# 中 HybridDictionary 类特有的。因此,GetType() 方法可供 C# 中的所有类访问。"System.Type" 的实例,表示当前对象的运行时类型信息,由 GetType() 函数返回。此数据包含类名、声明它的程序集、它公开的方法以及其他元数据等详细信息。

语法

它具有以下语法:

参数

public: 该方法可以从类外部访问,如 public 关键字所示。"System.Object" 类的此实例具有一个名为 GetType() 的公共方法,可以在任何对象实例上调用。

Type: 运行时类型信息由 System 命名空间中的 Type 类表示。GetType() 方法返回此 Type 类的一个实例。

GetType: 它是方法的名称。它是基类 "System.Object" 提供的一个标准方法,C# 中的所有类都继承它。

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 GetType() 函数

输出

Type Name: System.Collections.Specialized.HybridDictionary
Assembly: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Is Class: True
Is Interface: False
The Object is of type HybridDictionary

说明

在此示例中,使用 GetType() 调用 HybridDictionary 的实例,并使用返回的 Type 对象获取有关类型的不同详细信息。

10. ToString()

ToString() 方法 不是 C# 中 HybridDictionary 类特有的。相反,它继承自 "System.Object",它是 C# 中所有类型的基础类。因此,C# 中的任何类都可以访问 ToString() 方法。

为了获取对象的字符串表示,请使用 ToString() 方法。在派生类中,它通常被重写,以根据类的特定特性提供更有意义的字符串表示。

语法

它具有以下语法:

示例

让我们举一个例子来说明 C# 中 HybridDictionary 类中的 ToString() 函数

输出

HybridDictionary as a string: System.Collections.Specialized.HybridDictionary

说明

HybridDictionary 对象与 "Console.WriteLine" 语句中的字符串连接时,ToString() 方法隐式执行。如有必要,我们可以显式调用 ToString()。类经常重写 ToString() 方法以实现自定义字符串表示。Object 中的默认实现返回类型的完全限定名。


下一个主题C# 代码优化技巧