Hashtable(散列表)透過演算法根據鍵決定值的儲存位置。這個演算法分兩部分:Hashtable 內部邏輯,以及鍵類別必須提供的 GetHashCode() 方法。內建型別(如 string)已實作良好的雜湊演算法,但自訂鍵類別需自行覆寫。
System.Objectint 雜湊碼,供 Hashtable 計算儲存索引Hashtable 取得雜湊碼後,經過複雜運算(涉及質數、位移等)得到最終桶位索引不同鍵可能產生相同雜湊碼(衝突),或落入同一桶位。此時 Hashtable 會呼叫 Equals() 比較實際鍵值。因此必須同時覆寫 GetHashCode() 與 Equals(),且兩者邏輯必須一致:相等物件雜湊碼必須相同。
public class EmployeeID
{
public string Id { get; private set; }
public EmployeeID(string id) { Id = id; }
public override int GetHashCode()
{
return Id?.GetHashCode() ?? 0; // 防禦性程式設計
}
public override bool Equals(object obj)
{
return obj is EmployeeID other && Id == other.Id;
}
}
public class EmployeeData
{
public string Name { get; set; }
public string Age { get; set; }
public string Gender { get; set; }
public EmployeeData(string name, string age, string gender)
{
Name = name; Age = age; Gender = gender;
}
}
公司建立員工字典,以 EmployeeID 為鍵、EmployeeData 為值。透過員工編號快速查詢詳細資料。完整測試碼請參閱第(二)部分。
Dictionary<TKey, TValue>,避免裝箱/拆箱與型別轉換IEquatable<T> 介面