English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# Hashtable(哈希表)

Hashtable 是一个存储键值对的非泛型集合,类似于泛型 Dictionary<TKey,TValue> 集合。它通过计算每个键的哈希码优化查找,并在内部将其存储在不同的 bucket 中,然后在访问值时匹配指定键的哈希码。

哈希表特性

  • Hashtable 存储键值对。

  • 属于System.Collection命名空间。

  • 实现IDictionary接口。

  • 键必须是唯一的,不能为null。

  • 值可以为null或重复。

  • 可以通过在索引器中传递相关键来访问值,例如 myHashtable[key]

  • 元素作为 DictionaryEntry 对象存储。

创建哈希表(HashTable)

下面的示例演示如何创建哈希表和添加元素。

Hashtable numberNames = new Hashtable();
numberNames.Add(1,"One"); //使用Add()方法添加键/值
numberNames.Add(2,"Two");
numberNames.Add(3,"Three");
//以下引发运行时异常:已添加键。run-time exception: key already added.
//numberNames.Add(3, "Three"); 
foreach(DictionaryEntry de in numberNames)
    Console.WriteLine("Key: {0}, Value: {)1}
//COLLECTION 사용-initializer 문법으로Hashtable 생성
var cities = new Hashtable(){
	{"영국", "런던,만체스터,브리스톨"},
	{"미국", "시카고,뉴욕,워싱턴"},
	{"인도", "孟买,ニューデリー,포네"}
};
foreach(DictionaryEntry de in cities)
    Console.WriteLine("Key: {0}, Value: {)1}

Hashtable 컬렉션이 딕셔너리의 모든 요소를 포함할 수 있습니다. 이렇게 됩니다.

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "one");
dict.Add(2, "two");
dict.Add(3, "three");
Hashtable ht = new Hashtable(dict);

해시테이블 업데이트

INDEXER에 키를 전달하여 해시테이블에서 기존 키의 값을 검색할 수 있습니다.Hashtable는 비가변형 컬렉션인 데다가 값을 검색할 때 강제 변환을 해야 합니다.

//COLLECTION 사용-initializer 문법으로Hashtable 생성
var cities = new Hashtable(){
	{"영국", "런던,만체스터,브리스톨"},
	{"미국", "시카고,뉴욕,워싱턴"},
	{"인도", "孟买,ニューデリー,포네"}
};
    
string citiesOfUK = (string) cities["영국"]; //문자열로 변환
string citiesOfUSA = (string) cities["미국"]; //문자열로 변환
Console.WriteLine(citiesOfUK);
Console.WriteLine(citiesOfUSA);
cities["영국"] = "리버풀,브리스톨"; // UK의 값을 업데이트
cities["미국"] = "로스앤젤레스, 보스턴"; //USA의 값을 업데이트
if(!cities.ContainsKey("프랑스")){
    cities["프랑스"] = "파리";
}

해시테이블에서 요소 제거

Remove() 메서드는 해시테이블에서 지정된 값과 일치하는 키-값을 제거합니다. 지정된 키가 해시테이블에 없으면 KeyNotFoundException이 발생합니다. 따라서 제거하기 전에 ContainsKey() 메서드를 사용하여 기존 키를 확인해야 합니다.

Clear() 메서드를 사용하면 모든 요소를 한 번에 제거할 수 있습니다。

var cities = new Hashtable(){
	{"영국", "런던,만체스터,브리스톨"},
	{"미국", "시카고,뉴욕,워싱턴"},
	{"인도", "孟买,ニューデリー,포네"}
};
cities.Remove("UK"); // UK를 제거하십시오
//UK를 제거하십시오 //런타임 예외를 발생시킵니다: KeyNotFoundException
if(cities.ContainsKey("France")){ // 키를 꺼내기 전에 확인하십시오
    UK를 제거하십시오
}
cities.Clear(); //모든 요소를 제거하십시오

해시 테이블 클래스 계층 구조

아래는 Hashtable 클래스의 계층 구조를 설명합니다.

C# 해시 테이블