배열Arrays

배열은 동일한 형식의 연속 데이터 요소에 대 한 고정 크기의 변경 가능한 컬렉션으로, 0부터 시작 합니다.Arrays are fixed-size, zero-based, mutable collections of consecutive data elements that are all of the same type.

참고

F #에 대 한 docs.microsoft.com API 참조가 완전 하지 않습니다.The docs.microsoft.com API reference for F# is not complete. 끊어진 링크가 있는 경우 대신 F # 핵심 라이브러리 설명서 를 참조 하세요.If you encounter any broken links, reference F# Core Library Documentation instead.

배열 만들기Create arrays

여러 가지 방법으로 배열을 만들 수 있습니다.You can create arrays in several ways. 다음 예제와 같이 및 사이에 연속 값을 나열 [||] 고 세미콜론으로 구분 하 여 작은 배열을 만들 수 있습니다.You can create a small array by listing consecutive values between [| and |] and separated by semicolons, as shown in the following examples.

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

각 요소를 별도의 줄에 배치할 수도 있습니다 .이 경우 세미콜론 구분 기호는 선택 사항입니다.You can also put each element on a separate line, in which case the semicolon separator is optional.

let array1 =
    [|
        1
        2
        3
     |]

배열 요소의 형식은 사용 된 리터럴에서 유추 되며 일치 해야 합니다.The type of the array elements is inferred from the literals used and must be consistent. 다음 코드는 1.0가 float이 고 2와 3이 정수 이므로 오류가 발생 합니다.The following code causes an error because 1.0 is a float and 2 and 3 are integers.

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

시퀀스 식을 사용 하 여 배열을 만들 수도 있습니다.You can also use sequence expressions to create arrays. 다음은 1에서 10 사이의 정수 제곱 배열을 만드는 예제입니다.Following is an example that creates an array of squares of integers from 1 to 10.

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

모든 요소가 0으로 초기화 되는 배열을 만들려면를 사용 Array.zeroCreate 합니다.To create an array in which all the elements are initialized to zero, use Array.zeroCreate.

let arrayOfTenZeroes : int array = Array.zeroCreate 10

액세스 요소Access elements

점 연산자 ( . )와 대괄호 (및)를 사용 하 여 배열 요소에 액세스할 수 있습니다 [ ] .You can access array elements by using a dot operator (.) and brackets ([ and ]).

array1.[0]

배열 인덱스는 0부터 시작 합니다.Array indexes start at 0.

배열의 하위 범위를 지정 하는 데 사용할 수 있는 조각 표기법을 사용 하 여 배열 요소에 액세스할 수도 있습니다.You can also access array elements by using slice notation, which enables you to specify a subrange of the array. 조각 표기법의 예는 다음과 같습니다.Examples of slice notation follow.

// 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..]

조각 표기법을 사용 하면 배열의 새 복사본이 만들어집니다.When slice notation is used, a new copy of the array is created.

배열 형식 및 모듈Array types and modules

모든 F # 배열의 형식은 .NET Framework 형식입니다 System.Array .The type of all F# arrays is the .NET Framework type System.Array. 따라서 F # 배열은에서 사용할 수 있는 모든 기능을 지원 System.Array 합니다.Therefore, F# arrays support all the functionality available in System.Array.

라이브러리 모듈은 Microsoft.FSharp.Collections.Array 1 차원 배열에 대 한 작업을 지원 합니다.The library module Microsoft.FSharp.Collections.Array supports operations on one-dimensional arrays. 모듈 Array2D , 및에는 Array3D Array4D 각각 2, 3 및 4 차원 배열에 대 한 작업을 지 원하는 함수가 포함 되어 있습니다.The modules Array2D, Array3D, and Array4D contain functions that support operations on arrays of two, three, and four dimensions, respectively. 을 사용 하 여 4 보다 큰 차수 배열을 만들 수 있습니다 System.Array .You can create arrays of rank greater than four by using System.Array.

간단한 함수Simple functions

Array.get요소를 가져옵니다.Array.get gets an element. Array.length배열의 길이를 제공 합니다.Array.length gives the length of an array. Array.set요소를 지정 된 값으로 설정 합니다.Array.set sets an element to a specified value. 다음 코드 예제에서는 이러한 함수를 사용 하는 방법을 보여 줍니다.The following code example illustrates the use of these functions.

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)

출력은 다음과 같습니다.The output is as follows.

0 1 2 3 4 5 6 7 8 9

배열을 만드는 함수Functions that create arrays

여러 함수는 기존 배열을 요구 하지 않고 배열을 만듭니다.Several functions create arrays without requiring an existing array. Array.empty요소가 포함 되지 않은 새 배열을 만듭니다.Array.empty creates a new array that does not contain any elements. Array.create지정 된 크기의 배열을 만들고 모든 요소를 제공 된 값으로 설정 합니다.Array.create creates an array of a specified size and sets all the elements to provided values. Array.init지정 된 차원과 요소를 생성 하는 함수를 지정 하 여 배열을 만듭니다.Array.init creates an array, given a dimension and a function to generate the elements. Array.zeroCreate모든 요소가 배열의 형식에 대해 0 값으로 초기화 되는 배열을 만듭니다.Array.zeroCreate creates an array in which all the elements are initialized to the zero value for the array's type. 다음 코드에서는 이러한 함수를 보여 줍니다.The following code demonstrates these functions.

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

출력은 다음과 같습니다.The output is as follows.

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기존 배열에서 복사 된 요소를 포함 하는 새 배열을 만듭니다.Array.copy creates a new array that contains elements that are copied from an existing array. 복사본은 단순 복사본입니다. 즉, 요소 형식이 참조 형식이 면 참조만 복사 되 고 기본 개체는 복사 되지 않습니다.Note that the copy is a shallow copy, which means that if the element type is a reference type, only the reference is copied, not the underlying object. 다음 코드 예제에서는 그 구체적인 방법을 보여 줍니다.The following code example illustrates this.

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

위의 코드의 출력은 다음과 같습니다.The output of the preceding code is as follows:

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

Test1새 요소를 만드는 작업은에서 참조를 덮어쓰므로 firstArray 에서 여전히에 있는 빈 문자열에 대 한 원래 참조에는 영향을 주지 않기 때문에이 문자열은 첫 번째 배열에만 나타납니다 secondArray .The string Test1 appears only in the first array because the operation of creating a new element overwrites the reference in firstArray but does not affect the original reference to an empty string that is still present in secondArray. Test2 Insert 형식에 대 한 작업이 System.Text.StringBuilder 두 배열에서 참조 되는 기본 개체에 영향을 주기 때문에 두 배열에 문자열이 모두 표시 됩니다 System.Text.StringBuilder .The string Test2 appears in both arrays because the Insert operation on the System.Text.StringBuilder type affects the underlying System.Text.StringBuilder object, which is referenced in both arrays.

Array.sub배열의 하위 범위에서 새 배열을 생성 합니다.Array.sub generates a new array from a subrange of an array. 시작 인덱스 및 길이를 제공 하 여 하위 범위를 지정 합니다.You specify the subrange by providing the starting index and the length. 다음 코드는 Array.sub의 사용법을 보여줍니다.The following code demonstrates the use of Array.sub.

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

출력은 하위 배열을 요소 5에서 시작 하 고 10 개의 요소를 포함 하는 것을 보여 줍니다.The output shows that the subarray starts at element 5 and contains 10 elements.

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

Array.append두 개의 기존 배열을 결합 하 여 새 배열을 만듭니다.Array.append creates a new array by combining two existing arrays.

다음 코드에서는 배열. append를 보여 줍니다.The following code demonstrates Array.append.

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

위의 코드는 다음과 같이 출력 됩니다.The output of the preceding code is as follows.

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

Array.choose새 배열에 포함할 배열의 요소를 선택 합니다.Array.choose selects elements of an array to include in a new array. 다음 코드에서는을 보여 줍니다 Array.choose .The following code demonstrates Array.choose. 배열의 요소 형식은 옵션 형식에서 반환 되는 값의 형식과 일치할 필요가 없습니다.Note that the element type of the array does not have to match the type of the value returned in the option type. 이 예제에서 요소 형식은이 int 고 옵션은 다항식 함수의 결과인 elem*elem - 1 부동 소수점 숫자입니다.In this example, the element type is int and the option is the result of a polynomial function, elem*elem - 1, as a floating point number.

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

위의 코드는 다음과 같이 출력 됩니다.The output of the preceding code is as follows.

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

Array.collect기존 배열의 각 배열 요소에 대해 지정 된 함수를 실행 한 다음 함수에 의해 생성 된 요소를 수집 하 여 새 배열로 결합 합니다.Array.collect runs a specified function on each array element of an existing array and then collects the elements generated by the function and combines them into a new array. 다음 코드에서는을 보여 줍니다 Array.collect .The following code demonstrates Array.collect.

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

위의 코드는 다음과 같이 출력 됩니다.The output of the preceding code is as follows.

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

Array.concat배열의 시퀀스를 사용 하 여 단일 배열로 결합 합니다.Array.concat takes a sequence of arrays and combines them into a single array. 다음 코드에서는을 보여 줍니다 Array.concat .The following code demonstrates Array.concat.

Array.concat [ [|0..3|] ; [|4|] ]
//output [|0; 1; 2; 3; 4|]

Array.concat [| [|0..3|] ; [|4|] |]
//output [|0; 1; 2; 3; 4|]

위의 코드는 다음과 같이 출력 됩니다.The output of the preceding code is as follows.

[|(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부울 조건 함수를 사용 하 고 조건이 true 인 입력 배열의 요소만 포함 하는 새 배열을 생성 합니다.Array.filter takes a Boolean condition function and generates a new array that contains only those elements from the input array for which the condition is true. 다음 코드에서는을 보여 줍니다 Array.filter .The following code demonstrates Array.filter.

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

위의 코드는 다음과 같이 출력 됩니다.The output of the preceding code is as follows.

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

Array.rev기존 배열의 순서를 반대로 하 여 새 배열을 생성 합니다.Array.rev generates a new array by reversing the order of an existing array. 다음 코드에서는을 보여 줍니다 Array.rev .The following code demonstrates Array.rev.

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

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

위의 코드는 다음과 같이 출력 됩니다.The output of the preceding code is as follows.

"Hello world!"

다음 예제와 같이 파이프라인 연산자 ()를 사용 하 여 배열을 변환 하는 배열 모듈의 함수를 쉽게 결합할 수 있습니다 |> .You can easily combine functions in the array module that transform arrays by using the pipeline operator (|>), as shown in the following example.

[| 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"

출력은 다음과 같습니다.The output is

[|100; 36; 16; 4|]

다차원 배열Multidimensional arrays

다차원 배열을 만들 수 있지만 다차원 배열 리터럴을 작성 하기 위한 구문이 없습니다.A multidimensional array can be created, but there is no syntax for writing a multidimensional array literal. 연산자를 사용 array2D 하 여 배열 요소의 시퀀스 시퀀스에서 배열을 만듭니다.Use the operator array2D to create an array from a sequence of sequences of array elements. 시퀀스는 배열 또는 목록 리터럴일 수 있습니다.The sequences can be array or list literals. 예를 들어 다음 코드는 2 차원 배열을 만듭니다.For example, the following code creates a two-dimensional array.

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

또한 함수를 사용 하 여 Array2D.init 두 차원의 배열을 초기화할 수 있으며, 3 개 차원 및 4 차원 배열에도 유사한 함수를 사용할 수 있습니다.You can also use the function Array2D.init to initialize arrays of two dimensions, and similar functions are available for arrays of three and four dimensions. 이러한 함수는 요소를 만드는 데 사용 되는 함수를 사용 합니다.These functions take a function that is used to create the elements. 함수를 지정 하는 대신 초기 값으로 설정 된 요소를 포함 하는 2 차원 배열을 만들려면 Array2D.create 최대 4 차원 배열에도 사용할 수 있는 함수를 사용 합니다.To create a two-dimensional array that contains elements set to an initial value instead of specifying a function, use the Array2D.create function, which is also available for arrays up to four dimensions. 다음 코드 예제에서는 먼저 원하는 요소를 포함 하는 배열 배열을 만든 다음를 사용 하 여 Array2D.init 원하는 2 차원 배열을 생성 하는 방법을 보여 줍니다.The following code example first shows how to create an array of arrays that contain the desired elements, and then uses Array2D.init to generate the desired two-dimensional array.

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

배열 인덱싱 및 조각화 구문은 차수가 4 인 배열에 대해 지원 됩니다.Array indexing and slicing syntax is supported for arrays up to rank 4. 여러 차원에서 인덱스를 지정 하는 경우 다음 코드 예제에 나와 있는 것 처럼 쉼표를 사용 하 여 인덱스를 구분 합니다.When you specify an index in multiple dimensions, you use commas to separate the indexes, as illustrated in the following code example.

twoDimensionalArray.[0, 1] <- 1.0

2 차원 배열의 형식은 <type>[,] (예:,)로 작성 되 int[,] double[,] 고 3 차원 배열의 형식은로 작성 되며, <type>[,,] 더 큰 차원의 배열에 대해서는로 작성 됩니다.The type of a two-dimensional array is written out as <type>[,] (for example, int[,], double[,]), and the type of a three-dimensional array is written as <type>[,,], and so on for arrays of higher dimensions.

다차원 배열에는 1 차원 배열에 사용할 수 있는 함수의 하위 집합만 사용할 수 있습니다.Only a subset of the functions available for one-dimensional arrays is also available for multidimensional arrays. 자세한 내용은,, 및을 참조 하십시오 Collections.Array Module Collections.Array2D Module Collections.Array3D Module Collections.Array4D Module .For more information, see Collections.Array Module, Collections.Array2D Module, Collections.Array3D Module, and Collections.Array4D Module.

배열 조각화 및 다차원 배열Array slicing and multidimensional arrays

2 차원 배열 (행렬)에서 범위를 지정 하 고 와일드 카드 () 문자를 사용 하 여 하위 행렬을 추출 하 여 * 전체 행 또는 열을 지정할 수 있습니다.In a two-dimensional array (a matrix), you can extract a sub-matrix by specifying ranges and using a wildcard (*) character to specify whole rows or columns.

// 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]

F # 3.1을 통해 다차원 배열을 동일 하거나 더 낮은 차원의 subarrays으로 분해할 수 있습니다.As of F# 3.1, you can decompose a multidimensional array into subarrays of the same or lower dimension. 예를 들어 단일 행 또는 열을 지정 하 여 행렬에서 벡터를 가져올 수 있습니다.For example, you can obtain a vector from a matrix by specifying a single row or column.

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

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

요소 액세스 연산자 및 오버 로드 된 메서드를 구현 하는 형식에 대해이 조각화 구문을 사용할 수 있습니다 GetSlice .You can use this slicing syntax for types that implement the element access operators and overloaded GetSlice methods. 예를 들어 다음 코드는 F # 2D 배열을 래핑하고 항목 속성을 구현 하 여 배열 인덱싱에 대 한 지원을 제공 하 고 세 가지 버전의를 구현 하는 행렬 유형을 만듭니다 GetSlice .For example, the following code creates a Matrix type that wraps the F# 2D array, implements an Item property to provide support for array indexing, and implements three versions of GetSlice. 이 코드를 행렬 형식에 대 한 템플릿으로 사용할 수 있는 경우이 단원에서 설명 하는 모든 조각 작업을 사용할 수 있습니다.If you can use this code as a template for your matrix types, you can use all the slicing operations that this section describes.

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

배열의 부울 함수Boolean functions on arrays

Array.exists Array.exists2 각각 하나 또는 두 배열의 함수 및 테스트 요소입니다.The functions Array.exists and Array.exists2 test elements in either one or two arrays, respectively. 이러한 함수는 테스트 함수를 사용 하 고 true Array.exists2 조건을 충족 하는 요소 또는에 대 한 요소 쌍이 있는 경우를 반환 합니다.These functions take a test function and return true if there is an element (or element pair for Array.exists2) that satisfies the condition.

다음 코드에서는 및를 사용 하는 방법을 보여 줍니다 Array.exists Array.exists2 .The following code demonstrates the use of Array.exists and Array.exists2. 이러한 예제에서는 인수 중 하나 (이 경우에는 함수 인수)만 적용 하 여 새 함수를 만듭니다.In these examples, new functions are created by applying only one of the arguments, in these cases, the function argument.

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|])

위의 코드는 다음과 같이 출력 됩니다.The output of the preceding code is as follows.

true
false
false
true

마찬가지로 함수는 Array.forall 배열을 테스트 하 여 모든 요소가 부울 조건을 충족 하는지 여부를 확인 합니다.Similarly, the function Array.forall tests an array to determine whether every element satisfies a Boolean condition. Array.forall2동일한 길이의 두 배열의 요소를 포함 하는 부울 함수를 사용 하 여 변형이 동일한 작업을 수행 합니다.The variation Array.forall2 does the same thing by using a Boolean function that involves elements of two arrays of equal length. 다음 코드에서는 이러한 함수를 사용 하는 방법을 보여 줍니다.The following code illustrates the use of these functions.

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 |])

이러한 예제에 대 한 출력은 다음과 같습니다.The output for these examples is as follows.

false
true
true
false

검색 배열Search arrays

Array.find부울 함수를 사용 하 여 함수가 반환 하는 첫 번째 요소를 반환 true 하거나 System.Collections.Generic.KeyNotFoundException 조건을 충족 하는 요소가 없는 경우을 발생 시킵니다.Array.find takes a Boolean function and returns the first element for which the function returns true, or raises a System.Collections.Generic.KeyNotFoundException if no element that satisfies the condition is found. Array.findIndexArray.find 요소 자체 대신 요소의 인덱스를 반환 한다는 점을 제외 하 고와 비슷합니다.Array.findIndex is like Array.find, except that it returns the index of the element instead of the element itself.

다음 코드에서는 및를 사용 하 여 Array.find Array.findIndex 완전 한 정사각형과 완전 한 큐브인 숫자를 찾습니다.The following code uses Array.find and Array.findIndex to locate a number that is both a perfect square and perfect cube.

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

출력은 다음과 같습니다.The output is as follows.

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

Array.tryFindArray.find 결과가 옵션 형식 이라는 점을 제외 하 고는와 유사 하며, None 요소를 찾을 수 없는 경우를 반환 합니다.Array.tryFind is like Array.find, except that its result is an option type, and it returns None if no element is found. Array.tryFind``Array.find일치 하는 요소가 배열에 있는지 여부를 알 수 없는 경우 대신를 사용 해야 합니다.Array.tryFind should be used instead of Array.find when you do not know whether a matching element is in the array. 마찬가지로 Array.tryFindIndex Array.findIndex 옵션 유형이 반환 값 이라는 점을 제외 하 고는와 유사 합니다.Similarly, Array.tryFindIndex is like Array.findIndex except that the option type is the return value. 요소를 찾을 수 없는 경우 옵션은 None 입니다.If no element is found, the option is None.

다음 코드는 Array.tryFind의 사용법을 보여줍니다.The following code demonstrates the use of Array.tryFind. 이 코드는 이전 코드에 따라 달라 집니다.This code depends on the previous code.

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 |]

출력은 다음과 같습니다.The output is as follows.

Found an element: 1
Found an element: 729
Failed to find a matching element.

Array.tryPick요소를 찾을 뿐만 아니라 요소를 변환 해야 하는 경우에 사용 합니다.Use Array.tryPick when you need to transform an element in addition to finding it. 결과는 함수에서 변환 된 요소를 옵션 값으로 반환 하는 첫 번째 요소 이거나, None 이러한 요소가 없는 경우입니다.The result is the first element for which the function returns the transformed element as an option value, or None if no such element is found.

다음 코드는 Array.tryPick의 사용법을 보여줍니다.The following code shows the use of Array.tryPick. 이 경우 람다 식 대신 코드를 단순화 하기 위해 몇 가지 로컬 도우미 함수가 정의 됩니다.In this case, instead of a lambda expression, several local helper functions are defined to simplify the code.

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 |]

출력은 다음과 같습니다.The output is as follows.

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.
Did not find an element that is both a perfect square and a perfect cube.

배열에서 계산 수행Perform computations on arrays

Array.average함수는 배열의 각 요소에 대 한 평균을 반환 합니다.The Array.average function returns the average of each element in an array. 정수로 정확히 나누기를 지 원하는 요소 형식으로 제한 됩니다. 여기에는 부동 소수점 형식이 포함 되지만 정수 계열 형식은 포함 되지 않습니다.It is limited to element types that support exact division by an integer, which includes floating point types but not integral types. Array.averageBy함수는 각 요소에 대해 함수를 호출한 결과의 평균을 반환 합니다.The Array.averageBy function returns the average of the results of calling a function on each element. 정수 계열 형식의 배열에 대해를 사용 하 Array.averageBy 고 함수에서 각 요소를 계산에 대 한 부동 소수점 형식으로 변환할 수 있습니다.For an array of integral type, you can use Array.averageBy and have the function convert each element to a floating point type for the computation.

Array.max Array.min 요소 형식이 지 원하는 경우 또는를 사용 하 여 maximum 또는 minimum 요소를 가져옵니다.Use Array.max or Array.min to get the maximum or minimum element, if the element type supports it. 마찬가지로 Array.maxByArray.minBy 는 비교를 지 원하는 형식으로 변환 하는 등의 방법으로 함수를 먼저 실행할 수 있습니다.Similarly, Array.maxBy and Array.minBy allow a function to be executed first, perhaps to transform to a type that supports comparison.

Array.sum배열의 요소를 추가 하 고 Array.sumBy 각 요소에 대해 함수를 호출 하 고 결과를 함께 추가 합니다.Array.sum adds the elements of an array, and Array.sumBy calls a function on each element and adds the results together.

반환 값을 저장 하지 않고 배열의 각 요소에 대해 함수를 실행 하려면를 사용 Array.iter 합니다.To execute a function on each element in an array without storing the return values, use Array.iter. 길이가 같은 두 배열이 포함 된 함수의 경우를 사용 Array.iter2 합니다.For a function involving two arrays of equal length, use Array.iter2. 함수의 결과 배열을 유지 해야 하는 경우에 Array.map Array.map2 는 한 번에 두 배열에 대해 작동 하는 또는를 사용 합니다.If you also need to keep an array of the results of the function, use Array.map or Array.map2, which operates on two arrays at a time.

변형을 사용 하 여 Array.iteri Array.iteri2 요소의 인덱스를 계산에 포함 시킬 수 있습니다. 및의 경우에도 Array.mapi 마찬가지입니다. Array.mapi2The variations Array.iteri and Array.iteri2 allow the index of the element to be involved in the computation; the same is true for Array.mapi and Array.mapi2.

,, Array.fold ,, 및 함수는 Array.foldBack Array.reduce Array.reduceBack Array.scan Array.scanBack 배열의 모든 요소를 포함 하는를 실행 합니다.The functions Array.fold, Array.foldBack, Array.reduce, Array.reduceBack, Array.scan, and Array.scanBack execute algorithms that involve all the elements of an array. 마찬가지로, 변형이 Array.fold2 Array.foldBack2 두 배열에 대해 계산을 수행 합니다.Similarly, the variations Array.fold2 and Array.foldBack2 perform computations on two arrays.

계산을 수행 하는 이러한 함수는 목록 모듈에 있는 동일한 이름의 함수에 해당 합니다.These functions for performing computations correspond to the functions of the same name in the List module. 사용 예제는 목록을 참조 하십시오.For usage examples, see Lists.

배열 수정Modify arrays

Array.set요소를 지정 된 값으로 설정 합니다.Array.set sets an element to a specified value. Array.fill배열의 요소 범위를 지정 된 값으로 설정 합니다.Array.fill sets a range of elements in an array to a specified value. 다음 코드에서는의 예제를 제공 합니다 Array.fill .The following code provides an example of Array.fill.

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

출력은 다음과 같습니다.The output is as follows.

[|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|]

Array.blit를 사용 하 여 한 배열의 하위 섹션을 다른 배열로 복사할 수 있습니다.You can use Array.blit to copy a subsection of one array to another array.

다른 형식으로 변환Convert to and from other types

Array.ofList목록에서 배열을 만듭니다.Array.ofList creates an array from a list. Array.ofSeq시퀀스에서 배열을 만듭니다.Array.ofSeq creates an array from a sequence. Array.toListArray.toSeq 는 배열 형식에서 이러한 다른 컬렉션 형식으로 변환 합니다.Array.toList and Array.toSeq convert to these other collection types from the array type.

배열 정렬Sort arrays

Array.sort제네릭 비교 함수를 사용 하 여 배열을 정렬 하는 데 사용 합니다.Use Array.sort to sort an array by using the generic comparison function. Array.sortBy 에 대 한 제네릭 비교 함수를 사용 하 여 정렬 하려면 라고 하는 값을 생성 하는 함수를 지정 하는 데 사용 합니다.Use Array.sortBy to specify a function that generates a value, referred to as a key, to sort by using the generic comparison function on the key. Array.sortWith사용자 지정 비교 함수를 제공 하려는 경우를 사용 합니다.Use Array.sortWith if you want to provide a custom comparison function. Array.sort, Array.sortBy 및는 Array.sortWith 모두 정렬 된 배열을 새 배열로 반환 합니다.Array.sort, Array.sortBy, and Array.sortWith all return the sorted array as a new array. Array.sortInPlace, 및 변형은 Array.sortInPlaceBy Array.sortInPlaceWith 새 배열을 반환 하는 대신 기존 배열을 수정 합니다.The variations Array.sortInPlace, Array.sortInPlaceBy, and Array.sortInPlaceWith modify the existing array instead of returning a new one.

배열 및 튜플Arrays and tuples

함수 Array.zip 및는 Array.unzip 튜플 쌍의 배열을 배열의 튜플로 변환 하 고 그 반대의 경우도 마찬가지입니다.The functions Array.zip and Array.unzip convert arrays of tuple pairs to tuples of arrays and vice versa. Array.zip3및는 세 개의 요소로 된 튜플 Array.unzip3 또는 세 개의 배열로 된 튜플로 작업 한다는 점을 제외 하 고는 유사 합니다.Array.zip3 and Array.unzip3 are similar except that they work with tuples of three elements or tuples of three arrays.

배열에 대 한 병렬 계산Parallel computations on arrays

모듈에는 Array.Parallel 배열에 대 한 병렬 계산을 수행 하는 함수가 포함 되어 있습니다.The module Array.Parallel contains functions for performing parallel computations on arrays. 버전 4 이전 버전의 .NET Framework를 대상으로 하는 응용 프로그램에서는이 모듈을 사용할 수 없습니다.This module is not available in applications that target versions of the .NET Framework prior to version 4.

참고 항목See also