Udostępnij za pośrednictwem


Tablice (F#)

Tablice są zmiennymi kolekcjami kolejnych elementów danych o stałym rozmiarze, zaczynającymi się od zera, które są wszystkie tego samego typu.

Tworzenie tablic

Tablice można tworzyć na kilka sposobów.Możesz utworzyć małą tablicę wymieniając kolejne wartości między [| i |], oddzielone średnikami, jak pokazano w poniższych przykładach.

let array1 = [| 1; 2; 3 |]

Możesz również umieścić każdy element w osobnym wierszu, w takim przypadku użycie średnika jako separatora jest opcjonalne.

let array1 = 
    [|
        1
        2
        3
     |]

Typ elementów tablicy jest wnioskowany z używanych literałów i musi być zgodny.Poniższy kod powoduje błąd, ponieważ 1.0 to liczba zmiennoprzecinkowa, a 2 i 3 są liczbami całkowitymi.

// Causes an error.
// let array2 = [| 1.0; 2; 3 |] 

Możesz również używać wyrażeń sekwencji do tworzenia tablic.Oto przykład, w którym tworzona jest tablica kwadratów liczb całkowitych od 1 do 10.

let array3 = [| for i in 1 .. 10 -> i * i |]

Do utworzenia tablicy, w którym wszystkie elementy są ustawione na zero, użyj Array.zeroCreate.

let arrayOfTenZeroes : int array = Array.zeroCreate 10

Dostęp do elementów

Możesz uzyskać dostęp do elementów tablicy przy użyciu operatora kropka (.) i nawiasy kwadratowe ([ i ]).

array1.[0]

Indeksy tablicy rozpoczynają się od 0.

Możesz również uzyskać dostęp do elementów tablicy przy użyciu zapisu wycinkowego, który umożliwia określanie podzakresu tablicy.Poniżej są przykłady zapisu wycinkowego.

// Accesses elements from 0 to 2.
array1.[0..2]  
// Accesses elements from the beginning of the array to 2.
array1.[..2] 
// Accesses elements from 2 to the end of the array.
array1.[2..] 

W przypadku użycia zapisu wycinkowego tworzona jest nowa kopia tablicy.

Typy tablic i moduły

Typ wszystkich tablic F# to typ .NET Framework Array.W związku z tym, tablice F# obsługują wszystkie funkcje dostępne w Array.

Moduł biblioteki Microsoft.FSharp.Collections.Array obsługuje operacje na tablicach jednowymiarowych.Moduły Array2D, Array3D, i Array4D zawierają funkcje obsługujące operacje w tablicach o dwóch, trzech i czterech wymiarach, odpowiednio.Można utworzyć tablice o randze większej niż cztery za pomocą Array.

Proste funkcje

Array.Get pobiera element.Array.length podaje długość tablicy.Array.set ustawia element na określoną wartość.Poniższy przykład kodu ilustruje sposób korzystania z tych funkcji.

let array1 = Array.create 10 "" 
for i in 0 .. array1.Length - 1 do
    Array.set array1 i (i.ToString())
for i in 0 .. array1.Length - 1 do
    printf "%s " (Array.get array1 i)

Dane wyjściowe są następujące:

0 1 2 3 4 5 6 7 8 9

Funkcje, które tworzą tablice

Kilka funkcji tworzy tablice bez konieczności zapewnienia istniejącej tablicy.Array.Empty tworzy nową tablicę, która nie zawiera żadnych elementów.Array.Create tworzy tablicę o określonym rozmiarze i ustawia wszystkie elementy do podanych wartości.Array.init tworzy tablicę, biorąc pod uwagę wymiar i funkcję do generowania elementów.Array.zeroCreate utworzy tablicę, w której wszystkie elementy są inicjowane na wartość zero dla typu tablicy.Poniższy kod demonstruje te funkcje.

let myEmptyArray = Array.empty
printfn "Length of empty array: %d" myEmptyArray.Length

printfn "Array of floats set to 5.0: %A" (Array.create 10 5.0)
printfn "Array of squares: %A" (Array.init 10 (fun index -> index * index))
let (myZeroArray : float array) = Array.zeroCreate 10

Dane wyjściowe są następujące:

Length of empty array: 0
Area of floats set to 5.0: [|5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0|]
Array of squares: [|0; 1; 4; 9; 16; 25; 36; 49; 64; 81|]

Array.copy tworzy nową tablicę, która zawiera elementy kopiowane z istniejącej tablicy.Należy pamiętać, że kopia jest kopią pobieżną, co oznacza, że jeśli typem elementu jest typ odwołania, kopiowane jest tylko odwołanie, a nie obiekt podstawowy.Ilustruje to poniższy przykład kodu.

open System.Text

let firstArray : StringBuilder array = Array.init 3 (fun index -> new StringBuilder(""))
let secondArray = Array.copy firstArray
// Reset an element of the first array to a new value.
firstArray.[0] <- new StringBuilder("Test1")
// Change an element of the first array.
firstArray.[1].Insert(0, "Test2") |> ignore
printfn "%A" firstArray
printfn "%A" secondArray

Dane wyjściowe dla poprzedniego kodu wyglądają następująco:

[|Test1; Test2; |]
[|; Test2; |]

Ciąg Test1 pojawia się tylko w pierwszej tablicy, ponieważ operacja tworzenia nowego elementu zastępuje odniesienie w firstArray , ale nie wpływa na pierwotne odniesienie do pustego ciągu, który jest nadal obecny w secondArray.Ciąg Test2 pojawia się w obu tablicach, ponieważ operacja Insert na typie StringBuilder wpływa na podlegający obiekt StringBuilder, posiadający odwołanie w obu tablicach.

Array.Sub generuje nową tablicę z podzakresu tablicy.Określasz podzakres podając indeks początkowy i długość.Poniższy przykład demonstruje użycie Array.sub.

let a1 = [| 0 .. 99 |]
let a2 = Array.sub a1 5 10
printfn "%A" a2

Dane wyjściowe pokazują, że podtablica rozpoczyna się na elemencie 5 i zawiera 10 elementów.

[|5; 6; 7; 8; 9; 10; 11; 12; 13; 14|]

Array.append tworzy nową tablicę przez połączenie dwóch istniejących tablic.

Poniższy kod demonstruje Array.append.

printfn "%A" (Array.append [| 1; 2; 3|] [| 4; 5; 6|])

Dane wyjściowe dla poprzedniego kodu wyglądają następująco.

[|1; 2; 3; 4; 5; 6|]

Array.Choose wybiera elementy tablicy, aby dołączyć nową tablicę.Poniższy kod demonstruje Array.choose.Należy zauważyć, że typ elementu tablicy nie musi odpowiadać typowi wartości zwracanej w typie opcji.W tym przykładzie typem elementu jest int, a opcja jest wynikiem funkcji wielomianowej elem*elem - 1 jako zmiennoprzecinkowy numer punktu.

printfn "%A" (Array.choose (fun elem -> if elem % 2 = 0 then
                                            Some(float (elem*elem - 1))
                                        else
                                            None) [| 1 .. 10 |])

Dane wyjściowe dla poprzedniego kodu wyglądają następująco.

[|3.0; 15.0; 35.0; 63.0; 99.0|]

Array.Collect uruchamia określoną funkcję na każdym elemencie istniejącej tablicy, a następnie zbiera elementy wygenerowane przez tę funkcję i łączy je z nową tablicą.Poniższy kod demonstruje Array.collect.

printfn "%A" (Array.collect (fun elem -> [| 0 .. elem |]) [| 1; 5; 10|])

Dane wyjściowe dla poprzedniego kodu wyglądają następująco.

[|0; 1; 0; 1; 2; 3; 4; 5; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10|]

Array.concat wykonuje sekwencję tablic i łączy je w jedną.Poniższy kod demonstruje Array.concat.

let multiplicationTable max = seq { for i in 1 .. max -> [| for j in 1 .. max -> (i, j, i*j) |] }
printfn "%A" (Array.concat (multiplicationTable 3))

Dane wyjściowe dla poprzedniego kodu wyglądają następująco.

[|(1, 1, 1); (1, 2, 2); (1, 3, 3); (2, 1, 2); (2, 2, 4); (2, 3, 6); (3, 1, 3);
  (3, 2, 6); (3, 3, 9)|]

Array.Filter ma funkcję logiczną warunku i generuje nową tablicę zawierającą tylko te elementy z tablicy wejściowej, dla których warunek jest prawdziwy.Poniższy kod demonstruje Array.filter.

printfn "%A" (Array.filter (fun elem -> elem % 2 = 0) [| 1 .. 10|])

Dane wyjściowe dla poprzedniego kodu wyglądają następująco.

[|2; 4; 6; 8; 10|]

Array.Rev generuje nową tablicę przez odwrócenie kolejności istniejącej.Poniższy kod demonstruje Array.rev.

let stringReverse (s: string) =
    System.String(Array.rev (s.ToCharArray()))

printfn "%A" (stringReverse("!dlrow olleH"))

Dane wyjściowe dla poprzedniego kodu wyglądają następująco.

"Hello world!"

Łatwo można połączyć funkcje w module tablicy, które przetwarzają tablice za pomocą operatora potoku (|>), jak pokazano w następującym przykładzie.

[| 1 .. 10 |]
|> Array.filter (fun elem -> elem % 2 = 0)
|> Array.choose (fun elem -> if (elem <> 8) then Some(elem*elem) else None)
|> Array.rev
|> printfn "%A"

Wynik to

[|100; 36; 16; 4|]

Wielowymiarowe tablice

Tablica wielowymiarowa może być tworzona, ale nie ma składni pisania tablicy wielowymiarowej literału.Użyj operatora array2D, aby utworzyć tablicę z sekwencji sekwencji elementów tablicy.Sekwencje mogą być literałami tablicy lub listy.Na przykład poniższy kod tworzy dwuwymiarową tablicę.

let my2DArray = array2D [ [ 1; 0]; [0; 1] ]

Możesz również użyć funkcji Array2D.init, aby zainicjować tablice dwuwymiarowe, a podobne funkcje są dostępne dla tablic trójwymiarowych i czterowymiarowych.Te funkcje biorą funkcję, która jest używana do tworzenia elementów.Aby utworzyć dwuwymiarową tablicę zawierająca elementy ustawione na wartość początkową zamiast określania funkcji, użyj funkcji Array2D.create, która jest również dostępna dla tablic do maksymalnie czterech wymiarów.Poniższy przykład kodu po pierwsze ukazuje sposób tworzenia tablicy tablic, które zawierają żądane elementy, a następnie używa Array2D.init do wygenerowania pożądanej tablicy dwuwymiarowej.

let arrayOfArrays = [| [| 1.0; 0.0 |]; [|0.0; 1.0 |] |]
let twoDimensionalArray = Array2D.init 2 2 (fun i j -> arrayOfArrays.[i].[j]) 

Tablica indeksowania i składnia wycinków jest obsługiwana dla tablic do rangi 4.Po określeniu indeksu w wielu wymiarach, używasz przecinków do oddzielenia indeksów, jak pokazano w następującym przykładzie kodu.

twoDimensionalArray.[0, 1] <- 1.0

Rodzaj tablicy dwuwymiarowej jest zapisywany jako <type>[,] (na przykład int[,], double[,]), a rodzaj tablicy trójwymiarowej jest zapisywany jako <type>[,,], i tak dalej dla tablic wyższych wymiarów.

Tylko podzbiór funkcji dostępnych dla tablic jednowymiarowych jest również dostępny dla tablic wielowymiarowych.Aby uzyskać więcej informacji, zobacz Collections.Array — Moduł (F#), Collections.Array2D — Moduł (F#), Collections.Array3D — Moduł (F#), i Collections.Array4D — Moduł (F#).

Tablica wycinków i tablice wielowymiarowe

W dwuwymiarowej tablicy (macierzy) można wyodrębnić podrzędną macierzy, określając zakresy i używając znaku symbolu wieloznacznego (*) do określenia całych wierszy lub kolumn.

// Get rows 1 to N from an NxM matrix (returns a matrix):
matrix.[1.., *]

// Get rows 1 to 3 from a matrix (returns a matrix):
matrix.[1..3, *]

// Get columns 1 to 3 from a matrix (returns a matrix):
matrix.[*, 1..3]

// Get a 3x3 submatrix:
matrix.[1..3, 1..3]

Jak dla F# 3.1 można rozkładać tablicę wielowymiarową na podtablice tego samego lub niższego wymiaru.Na przykład można uzyskać wektor z macierzy, określając pojedynczy wiersz lub kolumnę.

// Get row 3 from a matrix as a vector:
matrix.[3, *]

// Get column 3 from a matrix as a vector:
matrix.[*, 3]

Możesz użyć tej składni wycinków dla typów, które implementują operatory dostępu do elementu i przeciążone metody GetSlice.Na przykład poniższy kod tworzy typ macierzy, który otacza tablicę 2D języka F#, implementuje właściwość Element zapewniającą wsparcia dla indeksowania tablic i implementuje trzy wersje obiektu GetSlice.Jeśli tego kodu można użyć jako szablonu dla typów macierzy użytkownika, można użyć wszystkich operacji tworzenia wycinków, które w tej sekcji opisano.

type Matrix<'T>(N: int, M: int) =
    let internalArray = Array2D.zeroCreate<'T> N M

    member this.Item
        with get(a: int, b: int) = internalArray.[a, b]
        and set(a: int, b: int) (value:'T) = internalArray.[a, b] <- value

    member this.GetSlice(rowStart: int option, rowFinish : int option,
                         colStart: int option, colFinish : int option) =
           let rowStart = match rowStart with
                          | Some(v) -> v
                          | None -> 0
           let rowFinish = match rowFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(0) - 1
           let colStart = match colStart with
                          | Some(v) -> v
                          | None -> 0
           let colFinish = match colFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(1) - 1
           internalArray.[rowStart..rowFinish, colStart..colFinish]

    member this.GetSlice(row: int, colStart: int option, colFinish: int option) =
           let colStart = match colStart with
                          | Some(v) -> v
                          | None -> 0
           let colFinish = match colFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(1) - 1
           internalArray.[row, colStart..colFinish]

    member this.GetSlice(rowStart: int option, rowFinish: int option, col: int) =
           let rowStart = match rowStart with
                          | Some(v) -> v
                          | None -> 0
           let rowFinish = match rowFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(0) - 1
           internalArray.[rowStart..rowFinish, col]

module test =

    let generateTestMatrix x y =
        let matrix = new Matrix<float>(3, 3);
        for i in 0..2 do
           for j in 0..2 do
               matrix.[i, j] <- float(i) * x - float(j) * y
        matrix

    let test1 = generateTestMatrix 2.3 1.1
    let submatrix = test1.[0..1, 0..1]
    printfn "%A" submatrix

    let firstRow = test1.[0,*]
    let secondRow = test1.[1,*]
    let firstCol = test1.[*,0]
    printfn "%A" firstCol

Funkcje logiczne w tablicach

Funkcje Array.exists i Array.exists2 testują elementy odpowiednio w jednej lub w dwóch tablicach.Te funkcje biorą funkcję testu i zwracają true jeśli istnieje element (lub para elementów dla Array.exists2) który spełnia warunek.

Poniższy przykład demonstruje użycie Array.exists i Array.exists2.W tych przykładach nowe funkcje są tworzone poprzez stosowanie tylko jednego z argumentów, w tych przypadkach argumentu funkcji.

let allNegative = Array.exists (fun elem -> abs (elem) = elem) >> not
printfn "%A" (allNegative [| -1; -2; -3 |])
printfn "%A" (allNegative [| -10; -1; 5 |])
printfn "%A" (allNegative [| 0 |])
let haveEqualElement = Array.exists2 (fun elem1 elem2 -> elem1 = elem2)
printfn "%A" (haveEqualElement [| 1; 2; 3 |] [| 3; 2; 1|])

Dane wyjściowe dla poprzedniego kodu wyglądają następująco.

true
false
false
true

Podobnie, funkcja Array.forall testuje tablicę, aby ustalić, czy każdy element spełnia warunek logiczny.Zmienna Array.forall2 robi to samo za pomocą funkcji logicznej, która obejmuje elementy dwóch tablic o równej długości.Poniższy kod ilustruje sposób korzystania z tych funkcji.

let allPositive = Array.forall (fun elem -> elem > 0)
printfn "%A" (allPositive [| 0; 1; 2; 3 |])
printfn "%A" (allPositive [| 1; 2; 3 |])
let allEqual = Array.forall2 (fun elem1 elem2 -> elem1 = elem2)
printfn "%A" (allEqual [| 1; 2 |] [| 1; 2 |])
printfn "%A" (allEqual [| 1; 2 |] [| 2; 1 |])

Dane wyjściowe dla tych przykładów wyglądają następująco.

false
true
true
false

Przeszukiwanie tablic

Array.Find przyjmuje wartość logiczną funkcji i zwraca pierwszy element, dla którego funkcja zwraca true, lub podwyższa KeyNotFoundException, jeśli nie zostanie znaleziony żaden element, który spełnia warunek.Array.findIndex jest jak Array.find, chyba że zwraca ona indeks elementu, a nie sam element.

Następujący kod używa Array.find i Array.findIndex, aby zlokalizować numer, który jest idealnym kwadratem i idealnym sześcianem.

let arrayA = [| 2 .. 100 |]
let delta = 1.0e-10
let isPerfectSquare (x:int) =
    let y = sqrt (float x)
    abs(y - round y) < delta
let isPerfectCube (x:int) =
    let y = System.Math.Pow(float x, 1.0/3.0)
    abs(y - round y) < delta
let element = Array.find (fun elem -> isPerfectSquare elem && isPerfectCube elem) arrayA
let index = Array.findIndex (fun elem -> isPerfectSquare elem && isPerfectCube elem) arrayA
printfn "The first element that is both a square and a cube is %d and its index is %d." element index

Dane wyjściowe są następujące:

The first element that is both a square and a cube is 64 and its index is 62.

Array.tryFind jest jak Array.find, z tym wyjątkiem, że jej wynik jest typem opcji i zwraca None, jeśli żaden element nie zostanie znaleziony.Array.tryFind powinno być używane zamiast Array.find, kiedy nie wiesz, czy jest pasujący element w tablicy.Podobnie Array.tryFindIndex jest jak Array.findIndex z taką różnicą, że typ opcji jest wartością zwracaną.Jeśli nie zostanie znaleziony żaden element, opcją jest None.

Poniższy przykład demonstruje użycie Array.tryFind.Ten kod zależy od poprzedniego kodu.

let delta = 1.0e-10
let isPerfectSquare (x:int) =
    let y = sqrt (float x)
    abs(y - round y) < delta
let isPerfectCube (x:int) =
    let y = System.Math.Pow(float x, 1.0/3.0)
    abs(y - round y) < delta
let lookForCubeAndSquare array1 =
    let result = Array.tryFind (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1
    match result with
    | Some x -> printfn "Found an element: %d" x
    | None -> printfn "Failed to find a matching element."

lookForCubeAndSquare [| 1 .. 10 |]
lookForCubeAndSquare [| 100 .. 1000 |]
lookForCubeAndSquare [| 2 .. 50 |]

Dane wyjściowe są następujące:

Found an element: 1
Found an element: 729

Użyj Array.tryPick kiedy chcesz zamienić element, nie tylko go znaleźć.Wynik jest pierwszym elementem, dla którego funkcja zwraca przekształcony element jako wartość opcji, lub None w przypadku nieznalezienia takiego elementu.

Poniższy kod pokazuje użycie Array.tryPick.W tym przypadku zamiast wyrażenia lambda kilka lokalnych funkcji pomocniczych jest zdefiniowanych w celu uproszczenia kodu.

let findPerfectSquareAndCube array1 =
    let delta = 1.0e-10
    let isPerfectSquare (x:int) =
        let y = sqrt (float x)
        abs(y - round y) < delta
    let isPerfectCube (x:int) =
        let y = System.Math.Pow(float x, 1.0/3.0)
        abs(y - round y) < delta
    // intFunction : (float -> float) -> int -> int 
    // Allows the use of a floating point function with integers. 
    let intFunction function1 number = int (round (function1 (float number)))
    let cubeRoot x = System.Math.Pow(x, 1.0/3.0)
    // testElement: int -> (int * int * int) option 
    // Test an element to see whether it is a perfect square and a perfect 
    // cube, and, if so, return the element, square root, and cube root 
    // as an option value. Otherwise, return None. 
    let testElement elem = 
        if isPerfectSquare elem && isPerfectCube elem then
            Some(elem, intFunction sqrt elem, intFunction cubeRoot elem)
        else None
    match Array.tryPick testElement array1 with
    | Some (n, sqrt, cuberoot) -> printfn "Found an element %d with square root %d and cube root %d." n sqrt cuberoot
    | None -> printfn "Did not find an element that is both a perfect square and a perfect cube."

findPerfectSquareAndCube [| 1 .. 10 |]
findPerfectSquareAndCube [| 2 .. 100 |]
findPerfectSquareAndCube [| 100 .. 1000 |]
findPerfectSquareAndCube [| 1000 .. 10000 |]
findPerfectSquareAndCube [| 2 .. 50 |]

Dane wyjściowe są następujące:

Found an element 1 with square root 1 and cube root 1.
Found an element 64 with square root 8 and cube root 4.
Found an element 729 with square root 27 and cube root 9.
Found an element 4096 with square root 64 and cube root 16.

Wykonywanie obliczeń na tablicach

Funkcja Array.average zwraca średnią dla każdego elementu w tablicy.Jest ona ograniczona do typów elementów, które obsługują dzielenie bez reszty przez liczbę całkowitą, co obejmuje typy zmiennoprzecinkowe, ale nie typy całkowitoliczbowe.Funkcja Array.averageBy zwraca średnią z wyników wywołania funkcji dla każdego elementu.W przypadku tablicy typu całkowitoliczbowego można użyć wyrażenia Array.averageBy i sprawić, aby funkcja konwertowała każdy element na typ zmiennoprzecinkowy dla obliczenia.

Użyj Array.max lub Array.min, aby zdobyć element maksymalny lub minimalny, jeśli typ elementu obsługuje tę funkcję.Podobnie Array.maxBy i Array.minBy pozwalają na wcześniejsze wykonanie funkcji, być może do przekształcenia do typu, który obsługuje porównania.

Array.sum dodaje elementy tablicy, a Array.sumBy wywołuje funkcję dla każdego elementu i dodaje wyniki razem.

Aby wykonać funkcję w każdym elemencie w tablicy bez przechowywania wartości zwracane, użyj Array.iter.Dla funkcji używającej dwóch tablic o równej długości użyj funkcji Array.iter2.Jeśli należy również zachować tablicę wyników funkcji, użyj metody Array.map lub Array.map2, która działa na dwóch tablicach jednocześnie.

Odchylenia Array.iteri i Array.iteri2 pozwalają na uwzględnienie indeksu elementu w obliczeniach; podobnie jest w przypadku Array.mapi i Array.mapi2.

Funkcje Array.fold, Array.foldBack, Array.reduce, Array.reduceBack, Array.scan, i Array.scanBack wykonują algorytmy, które obejmują wszystkie elementy tablicy.Podobnie, odmiany Array.fold2 i Array.foldBack2 wykonują obliczenia na dwóch tablicach.

Te funkcje do wykonywania obliczeń odpowiadają funkcjom o tej samej nazwie w Lista modułów.Aby uzyskać przykłady użycia, zobacz Listy (F#).

Modyfikowanie tablic

Array.set ustawia element na określoną wartość.Array.Fill ustawia zakres elementów w tablicy na określoną wartość.Poniższy kod stanowi przykład Array.fill.

let arrayFill1 = [| 1 .. 25 |]
Array.fill arrayFill1 2 20 0
printfn "%A" arrayFill1

Dane wyjściowe są następujące:

[|1; 2; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 23; 24; 25|]

Możesz użyć Array.blit, aby skopiować podsekcję jednej tablicy do innej tablicy.

Konwersja z i na inne typy

Array.ofList tworzy tablicę z listy.Array.ofSeq tworzy tablicę z sekwencji.Array.toList i Array.toSeq konwertują na inne typy kolekcji z typu tablicy.

Sortowanie tablic

Użyj Array.sort, aby posortować tablicę za pomocą funkcji porównania.Użyj Array.sortBy, aby określić funkcję, która generuje wartość, określaną jako klucz, aby sortować przy użyciu funkcji porównywania w kluczu.Użyj Array.sortWith, aby zapewnić niestandardową funkcję porównywania.Array.sort, Array.sortBy i Array.sortWith zwracają posortowaną tablicę jako nową.Odchylenia Array.sortInPlace, Array.sortInPlaceBy, i Array.sortInPlaceWith modyfikują istniejącą tablicę zamiast zwracać nową.

Tablice i krotki

Funkcje Array.zip i Array.unzip konwertują tablice par krotek na krotki tablic i na odwrót.Array.zip3 i Array.unzip3 są podobne, z tym wyjątkiem, że pracują z krotek trzech elementów lub krotek trzech tablic.

Obliczenia równoległe na tablicach

Moduł Array.Parallel zawiera funkcje do wykonywania obliczeń równoległych na tablicach.Ten moduł nie jest dostępny w aplikacjach przeznaczonych dla wersji systemu .NET Framework wcześniejszych niż wersja 4.

Zobacz też

Inne zasoby

Materiały referencyjne dotyczące języka F#

Typy F#