藉由檢閱本主題,您可以判斷哪一個 F# 集合類型最符合特定需求。 這些集合類型與 .NET 中的集合類型不同,例如命名空間中的 System.Collections.Generic 集合類型,因為 F# 集合類型是從功能性程式設計觀點而非面向物件檢視方塊所設計。 更具體來說,只有陣列集合具有可變動的元素。 因此,當您修改集合時,您會建立已修改集合的實例,而不是改變原始集合。
集合類型在儲存對象的數據結構類型上也不同。 哈希表、連結清單和數位等數據結構具有不同的效能特性,以及一組不同的可用作業。
集合類型的數據表
下表顯示 F# 集合類型。
| 類型 | 說明 | 相關連結 |
|---|---|---|
| 清單 | 相同類型的已排序、不可變的元素系列。 實作為連結清單。 |
清單 清單模組 |
| Array | 固定大小、以零起始、可變動的連續數據元素集合,這些元素全都屬於相同類型。 |
陣列 數位模組 Array2D 模組 Array3D 模組 |
| seq | 屬於一種型別之元素的邏輯系列。 當您擁有大量已排序的數據集合,但不一定預期使用所有元素時,序列特別有用。 個別序列元素只會視需要計算,因此如果不是使用所有元素,則序列的執行效能會比清單更好。 序列是由 seq<'T> 型別表示,這是的 IEnumerable<T>別名。 因此,任何實作 的 System.Collections.Generic.IEnumerable<'T> .NET Framework 類型都可以當做序列使用。 |
序列 Seq 模組 |
| 地圖 | 專案的不可變字典。 元素會依索引鍵存取。 | 地圖模組 |
| 設定 | 以二進位樹狀結構為基礎的不可變集合,其中比較是 F# 結構比較函式,其可能會在索引鍵值上使用 介面的 System.IComparable 實作。 |
設定模組 |
函式數據表
本節會比較 F# 集合類型上可用的函式。 會指定函式的計算複雜度,其中 N 是第一個集合的大小,而 M 是第二個集合的大小,如果有的話。 虛線 (-) 表示集合上無法使用此函式。 因為序列會延遲評估,因此 Seq.distinct 這類函式可能是 O(1),因為它會立即傳回,不過在列舉時仍會影響序列的效能。
| 功能 | Array | 清單 | 順序 | 地圖 | 設定 | 說明 |
|---|---|---|---|---|---|---|
| 附加 | O(N) | O(N) | O(N) | - | - | 傳回新的集合,其中包含第一個集合的元素,後面接著第二個集合的專案。 |
| 新增 | - | - | - | O(log(N)) | O(log(N)) | 傳回已加入 專案的新集合。 |
| 平均值 | O(N) | O(N) | O(N) | - | - | 傳回集合中專案的平均值。 |
| averageBy | O(N) | O(N) | O(N) | - | - | 傳回套用至每個元素之所提供函式結果的平均值。 |
| blit | O(N) | - | - | - | - | 複製陣列的區段。 |
| 快取 | - | - | O(N) | - | - | 計算和儲存序列的專案。 |
| 轉換 | - | - | O(N) | - | - | 將項目轉換成指定的型別。 |
| choose | O(N) | O(N) | O(N) | - | - | 將指定的函式 f 套用至清單的每個專案 x 。 傳回清單,其中包含函式傳 Some(f(x))回 之每個項目的結果。 |
| 收集 | O(N) | O(N) | O(N) | - | - | 將指定的函式套用至集合的每個專案、串連所有結果,並傳回合並的清單。 |
| compareWith | - | - | O(N) | - | - | 使用指定的比較函式、元素 by 元素來比較兩個序列。 |
| concat | O(N) | O(N) | O(N) | - | - | 將指定的列舉列舉結合為單一串連列舉。 |
| 包含 | - | - | - | - | O(log(N)) | 如果集合包含指定的專案,則傳回 true。 |
| containsKey | - | - | - | O(log(N)) | - | 測試專案是否位於地圖的網域中。 |
| count | - | - | - | - | O(N) | 傳回集合中項目的數目。 |
| countBy | - | - | O(N) | - | - | 將索引鍵產生函式套用至序列的每個專案,並傳回一個序列,該序列會產生唯一索引鍵及其在原始序列中的出現次數。 |
| 複製 | O(N) | - | O(N) | - | - | 複製集合。 |
| 建立 | O(N) | - | - | - | - | 建立所有一開始為指定值之整個項目的陣列。 |
| 延遲 | - | - | O(1) | - | - | 傳回從序列指定延遲規格所建置的序列。 |
| 差異 | - | - | - | - | O(M*log(N)) | 傳回新的集合,其中第二組的元素已從第一個集合移除。 |
| 獨特 | O(1)* | 根據專案的泛型哈希和相等比較,傳回不含重複專案的序列。 如果序列中多次發生專案,則會捨棄稍後的出現次數。 | ||||
| distinctBy | O(1)* | 根據指定索引鍵產生函式傳回之索引鍵的泛型哈希和相等比較,傳回不含重複專案的序列。 如果序列中多次發生專案,則會捨棄稍後的出現次數。 | ||||
| 空 | 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)) | 測試輸入序列的任何對應專案是否符合指定的述詞。 | ||
| 填滿 | O(N) | 將陣列的元素範圍設定為指定的值。 | ||||
| 篩選 | O(N) | O(N) | O(N) | O(N) | O(N) | 傳回新的集合,這個集合只包含指定述詞傳 true回的集合專案。 |
| 尋找 | 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引發 。 |
| 折疊 | O(N) | O(N) | O(N) | O(N) | O(N) | 將函式套用至集合的每個元素,透過計算線程累加器自變數。 如果輸入函式為 f,且元素為 i0...iN,此函式會計算 f (...(f s i0)...)在。 |
| 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) | - | - | 從集合傳回專案,指定其索引。 |
| 頁首 | - | O(1) | O(1) | - | - | 傳回集合的第一個專案。 |
| 初始化 | 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) | - | - | 傳回適用集合中的最後一個專案。 |
| 長度 | O(1) | O(N) | O(N) | - | - | 傳回集合中的項目數目。 |
| 地圖 | 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) | - | - | - | 建置集合,其專案是將指定函式套用至兩個集合對應項目的結果,也會傳遞專案的索引。 這兩個輸入陣列的長度必須相同。 |
| 最大值 | 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) | 建立集合,其中包含與指定序列相同的專案。 |
| pairwise | - | - | O(N) | - | - | 傳回輸入序列中每個元素的序列及其前置專案,但第一個專案除外,該元素只會傳回為第二個專案的前置專案。 |
| 分割 | O(N) | O(N) | - | O(N) | O(N) | 將集合分割成兩個集合。 第一個集合包含指定述詞傳回 true的專案,而第二個集合則包含指定述詞傳 false回的專案。 |
| 取代 | O(N) | O(N) | - | - | - | 根據指定的排列傳回所有元素排列的陣列。 |
| 摘 | O(N) | O(N) | O(N) | O(log(N)) | - | 將指定的函式套用至後續專案,並傳回函式傳回Some的第一個結果。 如果函式永遠不會傳回 Some, System.Collections.Generic.KeyNotFoundException 則會引發 。 |
| randomChoice | O(1) | O(1) | O(1) | - | - | 從指定的集合傳回隨機專案。 |
| randomChoiceBy | O(1) | O(1) | O(1) | - | - | 使用指定的 randomizer 函式,從指定的集合傳回隨機專案。 |
| randomChoiceWith | O(1) | O(1) | O(1) | - | - | 從具有指定 Random 實例的指定集合傳回隨機專案。 |
| randomChoices | O(count) | O(count) | O(count) | - | - | 從指定的集合傳回隨機元素的集合,可以多次選取每個元素。 |
| randomChoicesBy | O(count) | O(count) | O(count) | - | - | 使用指定的 randomizer 函式傳回指定集合中的隨機專案集合,可以多次選取每個元素。 |
| randomChoicesWith | O(count) | O(count) | O(count) | - | - | 傳回指定集合中具有指定 Random 實例的隨機專案集合,可以多次選取每個元素。 |
| randomSample | O(count) | O(count) | O(count) | - | - | 傳回指定集合中項目的隨機樣本,每個元素只能選取一次。 |
| randomSampleBy | O(count) | O(count) | O(count) | - | - | 使用指定的 randomizer 函式傳回指定colleciton中專案的隨機樣本,每個元素只能選取一次。 |
| randomSampleWith | O(count) | O(count) | O(count) | - | - | 傳回指定集合中具有指定 Random 實例之專案的隨機樣本,每個元素只能選取一次。 |
| randomShuffle | O(N) | O(N) | O(N) | - | - | 傳回隨機順序洗牌的新集合。 |
| randomShuffleBy | O(N) | O(N) | O(N) | - | - | 使用指定的 randomizer 函式,以隨機順序傳回新的集合。 |
| randomShuffleWith | O(N) | O(N) | O(N) | - | - | 使用指定的 Random 實例,以隨機順序傳回新的集合。 |
| randomShuffleInPlace | O(N) | - | - | - | - | 將陣列就地變動,以隨機順序排序輸入陣列。 |
| randomShuffleInPlaceBy | O(N) | - | - | - | - | 藉由就地變動陣列, randomizer 以隨機順序排序輸入陣列。 |
| randomShuffleInPlaceWith | O(N) | - | - | - | - | 藉由將陣列就地變動,以隨機順序排序輸入陣列與指定的 Random 實例。 |
| readonly | - | - | O(N) | - | - | 建立委派給指定時序物件的時序物件。 這項作業可確保類型轉換無法重新探索並變動原始序列。 例如,如果指定陣列,傳回的序列會傳回陣列的專案,但您無法將傳回的序列物件轉換成陣列。 |
| 減少 | O(N) | O(N) | O(N) | - | - | 將函式套用至集合的每個元素,透過計算線程累加器自變數。 此函式會先將函式套用至前兩個元素、將此結果連同第三個元素一起傳遞至函式,依此方式。 函式會傳回最終結果。 |
| reduceBack | O(N) | O(N) | - | - | - | 將函式套用至集合的每個元素,透過計算線程累加器自變數。 如果輸入函式為 f,且元素為 i0...iN,此函式會計算 f i0 (...(f iN-1 iN))。 |
| 移除 | - | - | - | O(log(N)) | O(log(N)) | 從地圖的定義域移除專案。 如果專案不存在,則不會引發任何例外狀況。 |
| 複製 | - | O(N) | - | - | - | 建立指定長度的清單,其中每個元素都設定為指定的值。 |
| 轉速 | O(N) | O(N) | - | - | - | 傳回具有專案反向順序的新清單。 |
| 掃描 | O(N) | O(N) | O(N) | - | - | 將函式套用至集合的每個元素,透過計算線程累加器自變數。 這項作業會將函式套用至第二個自變數和清單的第一個專案。 接著,此作業會將此結果連同第二個元素一起傳遞至 函式,依此方式。 最後,作業會傳回中繼結果清單和最終結果。 |
| scanBack | O(N) | O(N) | - | - | - | 類似於 foldBack 作業,但會同時傳回中繼和最終結果。 |
| singleton | - | - | O(1) | - | O(1) | 傳回只產生一個專案的序列。 |
| 設定 | O(1) | - | - | - | - | 將陣列的項目設定為指定的值。 |
| 略過 | - | - | O(N) | - | - | 傳回序列,略過基礎序列的 N 個元素,然後產生序列的其餘元素。 |
| skipWhile | - | - | O(N) | - | - | 傳回序列,當反覆運算時,在指定的述詞傳回 true 時略過基礎序列的元素,然後產生序列的其餘元素。 |
| 排序 | O(N*log(N)) 平均值 O(N^2) 最壞的情況 |
O(N*log(N)) | O(N*log(N)) | - | - | 依專案值排序集合。 使用 比較來比較元素。 |
| sortBy | O(N*log(N)) 平均值 O(N^2) 最壞的情況 |
O(N*log(N)) | O(N*log(N)) | - | - | 使用指定投影提供的索引鍵來排序指定的清單。 使用 比較來比較索引鍵。 |
| 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)) | - | - | - | 使用指定的比較函式做為順序並傳回新集合,排序集合的專案。 |
| 分支 | O(N) | - | - | - | - | 建置陣列,其中包含起始索引和長度所指定的指定子範圍。 |
| 總和 | O(N) | O(N) | O(N) | - | - | 傳回集合中項目的總和。 |
| sumBy | O(N) | O(N) | O(N) | - | - | 傳回將函式套用至集合中每個專案所產生的結果總和。 |
| 尾巴 | - | O(1) | - | - | - | 傳回沒有其第一個項目的清單。 |
| 拿 | - | - | 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) | 從指定的集合建立序列。 |
| 截斷 | - | - | 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 某些值的第一個結果。 如果不存在這類項目,作業會傳 None回 。 |
| 展開 | - | - | O(N) | - | - | 傳回序列,其中包含指定計算產生的專案。 |
| union | - | - | - | - | O(M*log(N)) | 計算兩組集合的聯集。 |
| unionMany | - | - | - | - | O(N1*N2...) | 計算集合序列的聯集。 |
| 解壓縮 | O(N) | O(N) | O(N) | - | - | 將配對清單分割成兩個清單。 |
| unzip3 | O(N) | O(N) | O(N) | - | - | 將三重清單分割成三個清單。 |
| 視窗 | - | - | O(N) | - | - | 傳回序列,其會產生滑動視窗,其中包含從輸入序列繪製的專案。 每個視窗都會以全新的數位傳回。 |
| 壓縮檔 | O(N) | O(N) | O(N) | - | - | 將兩個集合合併成配對清單。 這兩個清單的長度必須相等。 |
| zip3 | O(N) | O(N) | O(N) | - | - | 將三個集合合併成三重集合清單。 清單的長度必須相等。 |