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

C# 泛型秘訣(5.3):ReversibleSortedList 完整巢狀類型原始碼解析

     編輯:關於C#

本文呈現 ReversibleSortedList 內部完整巢狀類型原始碼,包含:Enumerator、KeyList、ValueList、ReversibleSortedListKeyEnumerator、ReversibleSortedListValueEnumerator,展示如何同時實作泛型/非泛型介面、支援正向/反向列舉、鍵值分離存儲。

核心巢狀類型架構

  • Enumerator<K,V>:實作 IEnumerator>、IDictionaryEnumerator、IEnumerator、IDisposable,版本檢查防止列舉中修改。
  • KeyList<K,V>:實作 IList、ICollection、IEnumerable,唯讀、支援 BinarySearch 快速 IndexOf。
  • ValueList<K,V>:同 KeyList 但針對 Value,IndexOf 用 Array.IndexOf 線性搜尋。
  • KeyEnumerator / ValueEnumerator:獨立列舉器,避免建立 KeyValuePair 物件開銷。

關鍵設計模式

使用特性

  • 鍵不可重複、不可為 null(值型別不可 null、參考型別不可 null)。
  • 值可為 null(參考型別)或預設值(值型別)。
  • 預設容量 4,成長倍數 2。
  • 索引器 this[TKey]:get 找不到回傳 default(TValue);set 自動插入/更新。
  • foreach 回傳 KeyValuePair 唯讀,列舉中修改集合拋例外。

原始碼重點片段


// 列舉器版本檢查
public bool MoveNext()
{
    if (this.version != this._list.version)
        throw new InvalidOperationException("Enumeration failed version check");
    if (this.index < this._list.Count)
    {
        this.key = this._list.keys[this.index];
        this.value = this._list.values[this.index];
        this.index++;
        return true;
    }
    this.index = this._list.Count + 1;
    this.key = default(K); this.value = default(V);
    return false;
}

// KeyList IndexOf 使用 BinarySearch
public int IndexOf(K key)
{
    if (key == null) throw new ArgumentNullException(nameof(key));
    int idx = Array.BinarySearch(this._dict.keys, 0, this._dict.Count, key, this._dict._sortDirectionComparer);
    return idx >= 0 ? idx : -1;
}

完整原始碼見文章區塊,展示生產級泛型集合實作的所有細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式體現位置
介面隔離分別實作泛型/非泛型 IEnumerable、ICollection、IList、IDictionaryEnumerator
版本檢查列舉器建構時捕捉 _list.version,MoveNext/Reset 比對,修改時拋 InvalidOperationException
鍵值分離陣列TKey[] keys、TValue[] values 平行陣列,BinarySearch 於 keys
排序方向可逆SortDirectionComparer 封裝升冪/降冪,ListSortDirection 切換
容量自動成長EnsureCapacity 雙倍擴充,InternalSetCapacity 複製陣列