共用方式為


F# 集合類型

藉由檢閱本主題,您可以判斷哪一個 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) - - 將三個集合合併成三重集合清單。 清單的長度必須相等。

另請參閱