ReversibleSortedList<TKey, TValue> 內部定義五個關鍵巢狀型別,分別實現列舉器、鍵集合、值集合等介面。本文完整呈現並解析這些巢狀型別的原始碼,展示框架級集合如何實現高效能、介面完整的列舉與檢視機制。
ReversibleSortedList<TKey, TValue> ├── Enumerator<K, V> // 主列舉器,實作 IEnumerator<KeyValuePair<K,V>> ├── KeyList<K, V> // 鍵集合檢視,實作 IList<K> 等 │ └── ReversibleSortedListKeyEnumerator // 鍵列舉器 ├── ValueList<K, V> // 值集合檢視,實作 IList<V> 等 │ └── ReversibleSortedListValueEnumerator // 值列舉器 └── (SortDirectionComparer) // 已於前文解析
_ReversibleSortedList:宿主容器參考index:當前位置(0-based,Count+1 表示結束)version:快照版本號,檢測列舉期間容器變更key, value:當前元素緩存KeyValuePair<K, V>(key, value)同時實作 IEnumerator、IDictionaryEnumerator、IDisposable,Current、Key、Value、Entry 皆有顯式實現,滿足非泛型列舉需求。
IList<K>、ICollection<K>、IEnumerable<K>Add、Insert、Remove、Clear、this[].set)拋出 NotSupportedExceptionCopyTo 直接 Array.Copy 宿主 keys 陣列IndexOf 使用 Array.BinarySearch O(log n)Contains 委派 ContainsKeyGetEnumerator 回傳專用 ReversibleSortedListKeyEnumeratorcurrentKey、index、versionMoveNext 直接讀取宿主 keys[index]KeyValuePair 物件,極致效能結構與 KeyList 完全對稱,操作 values 陣列,IndexOf 使用 Array.IndexOf 線性搜尋(值未排序)。
| 模式 | 應用位置 | 效益 |
|---|---|---|
| 結構體列舉器 | Enumerator, KeyEnumerator, ValueEnumerator | 零配置、值語義、快取友善 |
| 唯讀檢視 | KeyList, ValueList | 封裝內部陣列、防止外部破壞有序性 |
| 版本號檢查 | 所有列舉器 MoveNext/Reset | 快速失效,避免列舉期間修改導致未定義行為 |
| 雙介面實現 | 泛型 + 非泛型 IEnumerator/IDictionaryEnumerator | 最大相容性 |
| 二分搜尋索引 | KeyList.IndexOf | 利用鍵有序特性 O(log n) 定位 |
SortedList 一致,平衡記憶體與擴容頻率Add 會檢查並拋出異常Add/IndexOfKey 會檢查並拋出 ArgumentNullExceptionKeyValuePair 結構體,屬性唯讀,防止列舉期間修改巢狀型別設計展現了 .NET 框架集合的工程化極致:
研讀此原始碼,可深刻理解為何 SortedList/Dictionary 等核心集合能在高併發、大數據場景下穩定高效運行。