首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET Web Forms Hashtable 集合繫結:鍵值對快速查找、非排序選單建構與效能特性

     編輯:ASP.NET 基礎

ASP.NET Web Forms Hashtable 集合繫結:鍵值對快速查找、非排序選單建構與效能特性

Hashtable 是經典非泛型鍵值對集合,以雜湊表實作提供 **O(1) 平均查找/插入/刪除效能**,適合不需排序、強調查找速度的選單資料來源。本文涵蓋 Hashtable 建立、繫結、與 SortedList 差異比較、現代泛型替代方案。

Hashtable 核心特性

  • 命名空間:System.Collections
  • 鍵值對儲存,Key 不可為 null,Value 可為 null
  • Key 唯一,重複 Key 會覆蓋舊值
  • **不保證任何順序**(依雜湊碼分佈),不可依索引存取
  • Add(key, value) 新增項目
  • 執行緒安全:Hashtable.Synchronized() 取得同步包裝器

完整實作範例:國家代碼選單

後端程式碼

<script runat="server">
    void Page_Load() {
        if (!IsPostBack) {
            Hashtable countries = new Hashtable();
            countries.Add("TW", "台灣");
            countries.Add("JP", "日本");
            countries.Add("US", "美國");
            countries.Add("CN", "中國");
            
            rblCountries.DataSource = countries;
            rblCountries.DataTextField = "Value";
            rblCountries.DataValueField = "Key";
            rblCountries.DataBind();
        }
    }
    
    void rblCountries_SelectedIndexChanged(object sender, EventArgs e) {
        lblResult.Text = "選擇:" + rblCountries.SelectedItem.Text + " (" + rblCountries.SelectedValue + ")";
    }
</script>

前端宣告

<html><body>
<form runat="server">
    <h3>國家代碼選單(Hashtable,順序不固定):</h3>
    <asp:RadioButtonList ID="rblCountries" runat="server" 
        AutoPostBack="true" OnSelectedIndexChanged="rblCountries_SelectedIndexChanged">
    </asp:RadioButtonList>
    <br /><br />
    <asp:Label ID="lblResult" runat="server" ForeColor="Blue" Font-Bold="true" />
</form>
</body></html>

Hashtable 進階操作

基本 CRUD

Hashtable ht = new Hashtable();
ht["Key1"] = "Value1";      // 新增/修改(索引器語法)
ht.Add("Key2", "Value2");   // 新增(Key 重複拋例外)

string val = (string)ht["Key1"];  // 讀取(需型別轉換)
bool exists = ht.ContainsKey("Key1"); // true
bool hasVal = ht.ContainsValue("Value1"); // true

ht.Remove("Key1");          // 移除指定 Key
ht.Clear();                 // 清空

列舉所有項目

// 方式 1:DictionaryEntry 列舉
foreach (DictionaryEntry entry in ht) {
    Response.Write(entry.Key + "=" + entry.Value + "<br/>");
}

// 方式 2:Keys 集合
foreach (string key in ht.Keys) {
    Response.Write(key + "=" + ht[key] + "<br/>");
}

// 方式 3:Values 集合
foreach (string val in ht.Values) {
    Response.Write(val + "<br/>");
}

複製與同步

Hashtable clone = (Hashtable)ht.Clone();  // 淺層複製
Hashtable sync = Hashtable.Synchronized(ht); // 執行緒安全包裝

Hashtable vs SortedList vs Dictionary 核心差異

維度HashtableSortedListDictionary<TKey,TValue>
順序保證無(雜湊分佈)自動排序(依 Key)無(插入順序 .NET 3.7+ 保持)
查找效能O(1) 平均O(log n) 二分搜尋O(1) 平均
插入效能O(1) 平均O(n) 陣列位移O(1) 平均
型別安全否(object)否(object)是(泛型)
Null Key不允許不允許允許
Null Value允許允許允許
索引存取不支援支援 GetByIndex/SetByIndex不支援
記憶體開銷中等較低(陣列)中等
執行緒安全靜態 Synchronized()無內建無內建

繫結行為:Key/Value 對應 DataValueField/DataTextField

<asp:DropDownList ID="ddlCountries" runat="server" 
    DataSourceID="htCountries" 
    DataTextField="Value"    <-- 顯示 Hashtable 的 Value
    DataValueField="Key"     <-- 實際值為 Hashtable 的 Key
/>

適用控制項:RadioButtonList、CheckBoxList、DropDownList、ListBox、BulletedList

重要限制:無法控制排序順序

注意:Hashtable **無法指定項目排序順序**。若需要字母或數字排序,請改用 SortedList、SortedDictionary 或泛型 List<T> + LINQ OrderBy。

現代化替代方案:Dictionary<TKey, TValue>

.NET 2.0+ 強烈建議使用泛型 Dictionary<string, string>:

<script runat="server">
    void Page_Load() {
        if (!IsPostBack) {
            var countries = new Dictionary<string, string> {
                {"TW", "台灣"}, {"JP", "日本"}, {"US", "美國"}, {"CN", "中國"}
            };
            
            // 若需排序:countries.OrderBy(kvp => kvp.Key).ToList()
            // 若需保持插入順序:.NET 4.7+ Dictionary 保持插入順序
            
            rblCountries.DataSource = countries;
            rblCountries.DataTextField = "Value";
            rblCountries.DataValueField = "Key";
            rblCountries.DataBind();
        }
    }
</script>

Dictionary 優勢

  • 型別安全:編譯期檢查 Key/Value 型別
  • 效能更好:避免裝箱/拆箱
  • 語法簡潔:集合初始化器、索引器存取
  • LINQ 整合:Where、OrderBy、Select 等查詢
  • 序列化支援:JSON.NET、XmlSerializer 完美相容

適用場景決策指南

需求推薦集合理由
高頻查找、不需排序、舊版相容HashtableO(1) 查找、.NET 1.0 即支援
高頻查找、不需排序、新專案Dictionary<TKey,TValue>型別安全、效能最佳、現代標準
需自動排序、小量資料SortedList陣列實作、記憶體效率高、支援索引
需自動排序、大量資料、頻繁插入SortedDictionary<TKey,TValue>紅黑樹實作、O(log n) 插入/查找
需保持插入順序、快速查找Dictionary (.NET 4.7+)插入順序 = 列舉順序

常見問題排查

  • 選單順序每次不同:Hashtable 本質不保證順序,此為正常行為,需排序請換集合
  • Key 重複未報錯但資料遺失:使用索引器 ht[key] = value 會靜默覆蓋,Add 會拋 ArgumentException
  • Value 為 null 導致繫結異常:清單控制項繫結 null Value 可能顯示空白,建議預設空字串
  • 型別轉換例外:(string)ht[key] 若實際型別不符會拋 InvalidCastException,建議 ht[key]?.ToString()

Hashtable 以雜湊表高效查找特性服務於非排序選單場景,但現代開發首選型別安全的 Dictionary<TKey,TValue>。下一節將介紹 ArrayList 集合繫結與排序操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved