F# 集合型別
藉由檢閱本主題,您可以判斷哪一個 F# 集合型別最符合特定需求。 這些集合型別與 .NET 中的集合型別不同,例如 System.Collections.Generic
命名空間中的集合型別,因為 F# 集合型別在其中是從功能程式設計觀點設計,而不是物件導向的觀點。 更具體來說,只有陣列集合具有可變動的元素。 因此,當您修改集合時,您會建立已修改之集合的執行個體,而不是改變原始集合。
集合型別也與儲存物件所在的資料結構型別不同。 雜湊資料表、連結清單和陣列等資料結構具有不同的效能特性和一組不同的可用作業。
集合型別的資料表
下表顯示 F# 集合型別。
類型 | 描述 | 相關連結 |
---|---|---|
清單 | 一系列經過排序且型別相同的固定元素。 實作為連結清單。 | 清單 List 模組 |
Array | 固定大小、從零開始,全部具有相同型別的可變連續資料元素集合。 | 陣列 Array 模組 Array2D 模組 Array3D 模組 |
seq | 一系列邏輯元素,而所有元素的型別都相同。 當您有大型、已排序的資料集合,但不一定預期使用所有元素時,序列特別有用。 個別序列元素只會視需要計算,因此,如果未使用所有元素,序列的執行效能比清單更好。 序列是以 seq<'T> 型別表示,這是 IEnumerable<T> 的別名。 因此,任何 System.Collections.Generic.IEnumerable<'T> 實作的 .NET Framework 型別都可以當做序列使用。 |
序列 Seq 模組 |
地圖 | 元素的不可變字典。 元素是透過索引鍵來存取。 | Map 模組 |
設定 | 以二進位樹狀目錄為基礎的不可變集合,其中比較是 F# 結構比較函式,其可能會在索引鍵值上使用 System.IComparable 介面的實作。 |
Set 模組 |
函式資料表
本節會比較 F# 集合型別上可用的函式。 會指定函式的計算複雜度,其中 N 是第一個集合的大小,而 M 是第二個集合的大小,如果有的話。 破折號 (-) 表示集合上無法使用此函式。 由於序列經過延遲評估,因此 Seq.distinct
這類函式可能是 O(1),因為其會立即傳回,但是仍會在列舉時影響序列的效能。
函式 | Array | 清單 | 序列 | 地圖 | 設定 | 描述 |
---|---|---|---|---|---|---|
附加 | O(N) | O(N) | O(N) | - | - | 傳回新的集合,其中包含第一個集合的元素,後面接著第二個集合的元素。 |
add | - | - | - | O(log(N)) | O(log(N)) | 傳回具有已新增元素的新集合。 |
平均值 | O(N) | O(N) | O(N) | - | - | 傳回集合中的元素平均值。 |
averageBy | O(N) | O(N) | O(N) | - | - | 傳回套用至每個元素之所提供函式結果的平均值。 |
blit | O(N) | - | - | - | - | 複製陣列的一個區段。 |
快取 | - | - | O(N) | - | - | 計算及儲存序列的元素。 |
cast | - | - | O(N) | - | - | 將元素轉換為指定的型別。 |
選擇 | O(N) | O(N) | O(N) | - | - | 將指定的函式 f 套用至清單的每個元素 x 。 傳回清單,其中包含函式傳回 Some(f(x)) 之每個元素的結果。 |
收集 | O(N) | O(N) | O(N) | - | - | 將指定的函式套用至集合的每個元素、串連所有結果,並傳回合併的清單。 |
compareWith | - | - | O(N) | - | - | 使用指定的比較函式,逐元素來比較兩個序列。 |
concat | O(N) | O(N) | O(N) | - | - | 將指定的列舉列舉合併為單一串連列舉。 |
contains | - | - | - | - | O(log(N)) | 如果集合包含指定的元素,則傳回 True。 |
containsKey | - | - | - | O(log(N)) | - | 測試元素是否位於地圖的網域中。 |
計數 | - | - | - | - | O(N) | 傳回集合中項目的數目。 |
countBy | - | - | O(N) | - | - | 將索引鍵產生函式套用到序列的每一個元素,並傳回產生唯一索引鍵的序列及索引鍵在原始序列中的發生次數。 |
copy | O(N) | - | O(N) | - | - | 複製集合。 |
create | O(N) | - | - | - | - | 建立所有一開始為指定值之整個元素的陣列。 |
延遲 | - | - | O(1) | - | - | 傳回從序列指定延遲規格所建置的序列。 |
差異 | - | - | - | - | O(M*log(N)) | 傳回新集合,其具有從第一個集合移除的第二個集合元素。 |
distinct | O(1)* | 根據項目的泛型雜湊和相等比較,傳回不含重複項目的序列。 如果序列中多次發生元素,則會捨棄稍後的發生次數。 | ||||
distinctBy | O(1)* | 根據指定索引鍵產生函式傳回之索引鍵的泛型雜湊和相等比較,傳回不含重複項目的序列。 如果序列中多次發生元素,則會捨棄稍後的發生次數。 | ||||
empty | O(1) | O(1) | O(1) | O(1) | O(1) | 建立空集合。 |
存在 | O(N) | O(N) | O(N) | O(log(N)) | O(log(N)) | 測試序列的任何元素是否符合指定的述詞。 |
exists2 | O(min(N,M)) | - | O(min(N,M)) | 測試輸入序列的任何對應元素是否符合指定的述詞。 | ||
fill | O(N) | 將陣列的元素範圍設定為指定的值。 | ||||
篩選器 | O(N) | O(N) | O(N) | O(N) | O(N) | 傳回新的集合,這個集合只包含指定述詞傳回 true 之集合的元素。 |
find | O(N) | O(N) | O(N) | O(log(N)) | - | 傳回指定函式傳回 true 的第一個元素。 如果沒有此類元素存在,便會傳回 System.Collections.Generic.KeyNotFoundException 。 |
findIndex | O(N) | O(N) | O(N) | - | - | 傳回陣列中滿足指定述詞之第一個元素的索引。 如果沒有元素滿足述詞,則會引發 System.Collections.Generic.KeyNotFoundException 。 |
findKey | - | - | - | O(log(N)) | - | 評估集合中每個對應的函式,並傳回函式傳回 true 之第一個對應的索引鍵。 如果沒有這類元素存在,此函式會引發 System.Collections.Generic.KeyNotFoundException 。 |
fold | O(N) | O(N) | O(N) | O(N) | O(N) | 將函式套用至集合的每個元素,並透過計算對累加引數進行執行緒處理。 如果輸入函式為 f 且元素為 i0...iN,則此函式會計算 f (... (f s i0)...) iN。 |
fold2 | O(N) | O(N) | - | - | - | 將函式套用至兩個集合的對應元素,透過計算對累加引數進行執行緒處理。 集合的大小必須相同。 如果輸入函式為 f 且元素為 i0...iN 和 j0...jN,則此函式會計算 f (... (f s i0 j0)...) iN jN。 |
foldBack | O(N) | O(N) | - | O(N) | O(N) | 將函式套用至集合的每個元素,並透過計算對累加引數進行執行緒處理。 如果輸入函式為 f 且元素為 i0...iN,則此函式會計算 f i0 (...(f iN s))。 |
foldBack2 | O(N) | O(N) | - | - | - | 將函式套用至兩個集合的對應元素,透過計算對累加引數進行執行緒處理。 集合的大小必須相同。 如果輸入函式為 f 且元素為 i0...iN 和 j0...jN,則此函式會計算 f i0 j0 (...(f iN jN s))。 |
forall | O(N) | O(N) | O(N) | O(N) | O(N) | 測試集合的所有元素是否滿足指定的述詞。 |
forall2 | O(N) | O(N) | O(N) | - | - | 測試集合的所有對應元素是否滿足指定的述詞配對。 |
get / nth | O(1) | O(N) | O(N) | - | - | 傳回集合中指定其索引的元素。 |
head | - | O(1) | O(1) | - | - | 傳回集合的第一個元素。 |
init | O(N) | O(N) | O(1) | - | - | 建立集合,指定維度,並且建立產生器函式來計算元素。 |
initInfinite | - | - | O(1) | - | - | 藉由呼叫指定的函式,產生逐一查看時傳回後續元素的序列。 |
交集 | - | - | - | - | O(log(N)*log(M)) | 計算兩個集合的交集。 |
intersectMany | - | - | - | - | O(N1*N2...) | 計算集合序列的交集。 序列不能是空的。 |
isEmpty | O(1) | O(1) | O(1) | O(1) | - | 如果集合是空的,則傳回 true 。 |
isProperSubset | - | - | - | - | O(M*log(N)) | 如果第一個集合的所有元素都位於第二個集合中,且第二個集合中至少有一個元素不在第一個集合中,則傳回 true 。 |
isProperSuperset | - | - | - | - | O(M*log(N)) | 如果第二個集合的所有元素都位於第一個集合中,且第一個集合中至少有一個元素不在第二個集合中,則傳回 true 。 |
isSubset | - | - | - | - | O(M*log(N)) | 如果第一個集合的所有元素都位於第二個集合中,則傳回 true 。 |
isSuperset | - | - | - | - | O(M*log(N)) | 如果第二個集合的所有元素都位於第一個集合中,則傳回 true 。 |
iter | O(N) | O(N) | O(N) | O(N) | O(N) | 將指定的函式套用至集合的每個元素。 |
iteri | O(N) | O(N) | O(N) | - | - | 將指定的函式套用至集合的每個元素。 傳遞至函式的整數,表示元素的索引。 |
iteri2 | O(N) | O(N) | - | - | - | 將指定的函式套用至從兩個陣列中相符索引繪製的元素配對。 傳遞至函式的整數,表示元素的索引。 兩個陣列的長度必須相同。 |
iter2 | O(N) | O(N) | O(N) | - | - | 將指定的函式套用至從兩個陣列中相符索引繪製的元素配對。 兩個陣列的長度必須相同。 |
最後一 | O(1) | O(N) | O(N) | - | - | 傳回適用集合中的最後一個項目。 |
length | O(1) | O(N) | O(N) | - | - | 傳回集合中的元素數目。 |
map | O(N) | O(N) | O(1) | - | - | 建置集合,其元素是將指定函式套用至陣列每個元素的結果。 |
map2 | O(N) | O(N) | O(1) | - | - | 建置集合,其元素是將指定函式套用至兩個集合配對之對應元素的結果。 兩個輸入陣列的長度必須相同。 |
map3 | - | O(N) | - | - | - | 建置集合,其元素是同時將指定函式套用至三個集合之對應元素的結果。 |
mapi | O(N) | O(N) | O(N) | - | - | 建置陣列,其元素是將指定函式套用至陣列每個元素的結果。 傳遞至函式的整數索引,表示轉換之元素的索引。 |
mapi2 | O(N) | O(N) | - | - | - | 建置集合,其元素是將指定函式套用至兩個集合配對的對應元素,並且傳遞元素之索引的結果。 兩個輸入陣列的長度必須相同。 |
max | O(N) | O(N) | O(N) | - | - | 相較於使用 max 運算子,傳回集合中最大的元素。 |
maxBy | O(N) | O(N) | O(N) | - | - | 相較於使用函式結果上的 max 運算子,傳回集合中最大的元素。 |
maxElement | - | - | - | - | O(log(N)) | 根據用於集合的排序,傳回集合中最大的元素。 |
分鐘 | O(N) | O(N) | O(N) | - | - | 相較於使用 min 運算子,傳回集合中最小的元素。 |
minBy | O(N) | O(N) | O(N) | - | - | 相較於使用函式結果上的 min 運算子,傳回集合中最小的元素。 |
minElement | - | - | - | - | O(log(N)) | 根據用於集合的排序,傳回集合中最小的元素。 |
ofArray | - | O(N) | O(1) | O(N) | O(N) | 建立集合,其中包含與指定陣列相同的元素。 |
ofList | O(N) | - | O(1) | O(N) | O(N) | 建立集合,其中包含與指定清單相同的元素。 |
ofSeq | O(N) | O(N) | - | O(N) | O(N) | 建立集合,其中包含與指定序列相同的元素。 |
配對 | - | - | O(N) | - | - | 傳回輸入序列中每個元素的序列及其前置項目,但第一個元素除外,這只會傳回作為第二個元素的前置項目。 |
磁碟分割 | O(N) | O(N) | - | O(N) | O(N) | 將集合分割成兩個集合。 第一個集合包含指定述詞傳回 true 的元素,而第二個集合包含指定述詞傳回 false 的元素。 |
permute | O(N) | O(N) | - | - | - | 根據指定的排列傳回已排列所有元素的陣列。 |
pick | O(N) | O(N) | O(N) | O(log(N)) | - | 將指定的函式套用至後續元素,傳回函式傳回 Some 的第一個結果。 如果函式永遠不會傳回 Some,則會引發 System.Collections.Generic.KeyNotFoundException 。 |
readonly | - | - | O(N) | - | - | 建立委派給指定序列物件的序列物件。 這項作業可確保型別轉換無法重新探索並變動原始序列。 例如,如果指定陣列,傳回的序列會傳回陣列的元素,但是您無法將傳回的序列物件轉換成陣列。 |
reduce | O(N) | O(N) | O(N) | - | - | 將函式套用至集合的每個元素,並透過計算對累加引數進行執行緒處理。 此函式會從將函式套用至前兩個元素開始,將此結果連同第三個元素一起傳遞至函式,依此類傳。 函式會傳回最終結果。 |
reduceBack | O(N) | O(N) | - | - | - | 將函式套用至集合的每個元素,並透過計算對累加引數進行執行緒處理。 如果輸入函式為 f 且元素為 i0...iN,則此函式會計算 f i0 (...(f iN-1 iN))。 |
remove | - | - | - | O(log(N)) | O(log(N)) | 從地圖的網域移除元素。 如果元素不存在,則不會引發例外狀況。 |
replicate | - | O(N) | - | - | - | 建立指定長度的清單,並將每個元素設定為指定的值。 |
rev | O(N) | O(N) | - | - | - | 以反向順序傳回具有元素的新清單。 |
scan | O(N) | O(N) | O(N) | - | - | 將函式套用至集合的每個元素,並透過計算對累加引數進行執行緒處理。 此作業會將函式套用至清單的第二個引數和第一個元素。 接著,此作業會將此結果連同第二個元素一起傳遞至函式,依此類循。 最後,作業會傳回中繼結果和最終結果的清單。 |
scanBack | O(N) | O(N) | - | - | - | 類似於 foldBack 作業,但會同時傳回中繼和最終結果。 |
singleton | - | - | O(1) | - | O(1) | 傳回只產生一個項目的序列。 |
set | O(1) | - | - | - | - | 將陣列的元素設定為指定的值。 |
skip | - | - | O(N) | - | - | 傳回序列,略過基礎序列的 N 個元素,然後產生序列的其餘元素。 |
skipWhile | - | - | O(N) | - | - | 傳回序列,這個序列會在指定述詞傳回 true 時略過基礎序列的元素,然後產生序列的其餘元素。 |
sort | O(N*log(N)) 平均值 O(N^2) 最差情況 |
O(N*log(N)) | O(N*log(N)) | - | - | 依元素值排序集合。 使用 compare 來比較元素。 |
sortBy | O(N*log(N)) 平均值 O(N^2) 最差情況 |
O(N*log(N)) | O(N*log(N)) | - | - | 使用指定預測所提供的索引鍵來排序指定的清單。 使用 compare 來比較索引鍵。 |
sortInPlace | O(N*log(N)) 平均值 O(N^2) 最差情況 |
- | - | - | - | 藉由將陣列的元素就地變動,並使用指定的比較函式,來排序陣列的元素。 使用 compare 來比較元素。 |
sortInPlaceBy | O(N*log(N)) 平均值 O(N^2) 最差情況 |
- | - | - | - | 藉由將陣列的元素就地變動,並使用索引鍵的指定預測,來排序陣列的元素。 使用 compare 來比較元素。 |
sortInPlaceWith | O(N*log(N)) 平均值 O(N^2) 最差情況 |
- | - | - | - | 藉由將陣列的元素就地變動,並使用指定的比較函式作為順序,來排序陣列的元素。 |
sortWith | O(N*log(N)) 平均值 O(N^2) 最差情況 |
O(N*log(N)) | - | - | - | 使用指定的比較函式作為順序並傳回新集合,排序集合的元素。 |
sub | O(N) | - | - | - | - | 建置陣列,其中包含起始索引和長度所指定的指定子範圍。 |
總和 | O(N) | O(N) | O(N) | - | - | 傳回集合中的元素總和。 |
sumBy | O(N) | O(N) | O(N) | - | - | 傳回將函式套用至集合中每個元素所產生的結果總和。 |
tail | - | O(1) | - | - | - | 傳回沒有其第一個元素的清單。 |
take | - | - | O(N) | - | - | 傳回序列的元素,最多可傳回指定的計數。 |
takeWhile | - | - | O(1) | - | - | 傳回序列,當逐一查看時如果指定的述詞傳回 true 且之後不再傳回任何元素,會產生基礎序列的元素。 |
toArray | - | O(N) | O(N) | O(N) | O(N) | 從指定的集合建立陣列。 |
toList | O(N) | - | O(N) | O(N) | O(N) | 從指定的集合建立清單。 |
toSeq | O(1) | O(1) | - | O(1) | O(1) | 從指定的集合建立序列。 |
truncate | - | - | O(1) | - | - | 傳回序列,當列舉時,不會傳回 N 個以上的元素。 |
tryFind | O(N) | O(N) | O(N) | O(log(N)) | - | 搜尋符合指定述詞的元素。 |
tryFindIndex | O(N) | O(N) | O(N) | - | - | 搜尋滿足指定述詞的第一個元素,並傳回相符元素的索引,如果沒有這類元素,則為 None 。 |
tryFindKey | - | - | - | O(log(N)) | - | 傳回集合中滿足指定述詞之第一個對應的索引鍵,如果沒有這類元素,則傳回 None 。 |
tryPick | O(N) | O(N) | O(N) | O(log(N)) | - | 將指定的函式套用至後續元素,傳回函式針對 some 值傳回 Some 的第一個結果。 如果不存在這類元素,作業會傳回 None 。 |
unfold | - | - | O(N) | - | - | 傳回一個序列,其中包含指定計算所產生的元素。 |
union | - | - | - | - | O(M*log(N)) | 計算兩個集合的聯集。 |
unionMany | - | - | - | - | O(N1*N2...) | 計算集合序列的聯集。 |
unzip | O(N) | O(N) | O(N) | - | - | 將配對清單分割成兩個清單。 |
unzip3 | O(N) | O(N) | O(N) | - | - | 將三合一清單分割成三個清單。 |
時間範圍型 | - | - | O(N) | - | - | 傳回序列,這個序列會產生滑動視窗,其中包含從輸入序列繪製的元素。 每個視窗都會以全新的陣列傳回。 |
zip | O(N) | O(N) | O(N) | - | - | 將這兩個集合合併成配對清單。 這兩個清單的長度必須相等。 |
zip3 | O(N) | O(N) | O(N) | - | - | 將這三個集合合併成三合一清單。 清單的長度必須相等。 |