Aracılığıyla paylaş


Diziler (F#)

Sabit boyutlu, sıfırla doldurmakdizidir-bağlı olarak kesilebilir koleksiyonları ardışık veri öğelerinin tümü aynı türde.

Dizi oluşturma

Diziler oluşturmak birkaç yolla yapabilirsiniz.oluşturmak [| ve |] ve aşağıdaki örneklerde gösterildiği gibi noktalı virgülle ayrılmış.

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

Büyük/küçük harf noktalı virgül ayırıcı isteğe bağlı ayrı bir çizgiüzerinde her bir öğesi de yerleştirebilirsiniz.

let array1 = 
    [|
        1
        2
        3
     |]

Dizi öğelerini türü kullanılan harfleri algılanır ve tutarlı olmalıdır.Aşağıdaki kod, float 1.0 olduğundan ve 2 ve 3 tamsayý deðerleri olduðu bir hata neden olur.

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

dizi ifadeleri dizileri oluşturmak için de kullanabilirsiniz.1'den 10'a Dizi tamsayıların karelerinin yaratan örnek verilmektedir.

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

Bir dizi hangi tüm öğeleri başlatılan sıfırla doldurmakolarak oluşturmak için kullanmak Array.zeroCreate.

let arrayOfTenZeroes : int array = Array.zeroCreate 10

Öğeleri erişme

Dizi öğelerini bir nokta işleç (.) ve köşeli ayraçlar kullanarak erişebilirsiniz ([ve]).

array1.[0]

Dizi indeksleri 0 başlatın.

Dizi öğelerini, dizinin bir alt aralığı belirlemenize olanak tanır dilim gösterim biçimini kullanarak da erişebilirsiniz.Dilim gösterim örnekleri izleyin.

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

Dilim gösterim kullanıldığında, dizi yeni bir kopyası oluşturulur.

Dizi türleri ve modülleri

Tüm F# dizi türüdür.net Framework türü Array.Bu nedenle, F# diziler içinde kullanılabilen tüm işlevleri destekleyen Array.

kitaplıkmodülMicrosoft.FSharp.Collections.Array tek boyutlu diziler işlemlerini destekler. Modülleri Array2D, Array3D, ve Array4D iki, üç ve dört boyut dizilerinde işlemleri sırasıyla destek işlevleri içerir.derecelendirmek kullanarak dört büyük dizileri oluşturmak için Array.

Dd233214.collapse_all(tr-tr,VS.110).gifBasit işlevler

Array.Get bir öğe alır.Array.length bir dizi uzunluğunu verir.Array.set bir öğesi için belirtilen bir değere ayarlar.Aşağıdaki kod örneği, bu işlevler kullanımını göstermektedir.

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)

Çıktı aşağıdaki gibidir.

0 1 2 3 4 5 6 7 8 9

Dd233214.collapse_all(tr-tr,VS.110).gifDiziler oluşturmak işlevleri

Varolan bir dizi gerektirmeden çeşitli işlevler oluşturmak diziler.Array.Empty herhangi bir öğe içermeyen yeni bir dizi oluşturur.Dizi.oluşturmak belirtilen boyutta bir dizi oluşturur ve tüm öğeleri sağlanan değerlere ayarlar.Array.init bir boyut ve işlev öğeleri oluşturmak için verilen bir dizi oluşturur.Array.zeroCreate öğeleri hangi tüm başlatıldı dizi türü sıfırla doldurmak değeri için bir dizi oluşturur.Aşağıdaki kod bu işlevleri gösterir.

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

Çıktı aşağıdaki gibidir.

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 , varolan diziden kopyalanan öğeleri içeren yeni bir dizi oluşturur.Not öğe türü bir başvuru türüise, yalnızca başvuru kopyalanır anlamına gelir yüzeysel bir kopyasýný olduğunu, değil alttaki nesne.Aşağıdaki kod örneği, bunu göstermektedir.

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

Önceki kodun çıktısı aşağıdaki gibidir:

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

Dize Test1 yeni bir öğe oluşturma işlemi başvurusunda yazdığından yalnızca ilk dizide görünür firstArray de hala varsa boş bir dize özgün referansı etkilemez, ancak secondArray.Dize Test2 her iki dizide de görünür, çünkü Insert işlem StringBuilder türü etkiler temel StringBuilderher iki dizide de başvurulan nesne.

Array.Sub bir dizinin alt aralığı yeni bir dizi oluşturur.Başlangıç dizinini ve uzunluğunu sağlayarak alt aralığı belirtin.Aşağıdaki kodu kullanımını gösterir Array.sub.

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

Subarray 5 öğesinde başlar ve 10 öğeler içeren çıktıyı göstermektedir.

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

Dizi.eklemek varolan dizilerinin birleştirerek yeni bir dizi oluşturur.

Aşağıdaki kod gösterir Array.append.

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

Önceki kodun çıktısı aşağıdaki gibidir.

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

Array.Choose yeni bir dizi dahil etmek için bir dizinin öğeleri seçer.Aşağıdaki kod gösterir Array.choose.Dizi öğesi türü seçenek türünün döndürülen değer türüyle eşleşmesi gerekmez unutmayın.Bu örnekte, öğe türü olan int polinom işlevsonuç seçenektir ve elem*elem - 1, kayan nokta bir sayı olarak.

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

Önceki kodun çıktısı aşağıdaki gibidir.

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

Array.Collect her varolan bir dizi dizi öğesinde belirtilen işlev çalıştırır ve sonra işlev tarafından oluşturulan öğeleri toplar ve bunları yeni bir diziye birleştirir.Aşağıdaki kod gösterir Array.collect.

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

Önceki kodun çıktısı aşağıdaki gibidir.

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

Array.concat diziler dizi alır ve bunları tek bir diziye birleştirir.Aşağıdaki kod gösterir 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))

Önceki kodun çıktısı aşağıdaki gibidir.

[|(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 Boolean koşul işlev alır ve yalnızca kendisi için koşul doğruysa giriş diziden öğelerini içeren yeni bir dizi oluşturur.Aşağıdaki kod gösterir Array.filter.

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

Önceki kodun çıktısı aşağıdaki gibidir.

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

Array.Rev varolan bir dizi sırasını ters çevirerek yeni bir dizi oluşturur.Aşağıdaki kod gösterir Array.rev.

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

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

Önceki kodun çıktısı aşağıdaki gibidir.

"Hello world!"

Diziler potansiyel işleç kullanarak dönüştürme işlevleri dizi modül kolayca birleştirebilirsiniz (| >), aşağıdaki örnekte gösterildiği gibi.

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

Çıkış

[|100; 36; 16; 4|]

Dd233214.collapse_all(tr-tr,VS.110).gifÇok boyutlu diziler

Çok boyutlu bir dizi oluşturulabilir, ancak bir çok boyutlu dizi değişmezi yazmak için hiçbir sözdizimi vardır.işleçkullanınarray2D oluşturmak bir dizi dizi öğelerinin sıralarının dizi . Dizileri, dizi ya da liste hazır olabilir.Örneğin, aşağıdaki kod, iki boyutlu bir dizi oluşturur.

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

işlevde kullanabilirsinizArray2D.init , iki boyutun ve benzer diziler başlatmak için İşlevler üç ve dört boyutlar diziler için kullanılabilir. Bu işlevleri olan bir işlev olması öğeleri oluşturmak için kullanılır.Bir işlevbelirtmek yerine bir başlangıç değeri ayarlanmış öğelerini içeren iki boyutlu bir dizi oluşturmak için kullanmak Array2D.oluşturmakiçin kullanılabilir olanişlev, diziler en fazla dört boyut. Aşağıdaki kod örneği, ilk nasıl oluşturmak için bir dizi, dizi gösterir istediğiniz öğeleri sonra kullanımları içeren Array2D.init istenen iki boyutlu dizi oluşturmak için.

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

Dizin oluşturuluyor ve dilimleme sözdizimi dizi diziler derecelendirmek 4 kadar desteklenir.Dizin çoklu boyutları belirttiğinizde, virgül indices aşağıdaki kod örneğinde gösterildiği gibi kullanın.

twoDimensionalArray.[0, 1] <- 1.0

Olarak iki boyutlu bir dizi türünde yazılan <type>[,] (örneğin, int[,], double[,]), üç boyutlu bir dizi türü olarak yazılır ve <type>[,,], vb. için daha yüksek boyutlara dizileri.

Yalnızca tek boyutlu diziler için kullanılabilir işlevleri kümesini ayrıca çok boyutlu diziler için kullanılabilir.Daha fazla bilgi için bkz. Collections.Array Modülü (F#), Collections.Array2D Modülü (F#), Collections.Array3D Modülü (F#) ve Collections.Array4D Modülü (F#).

Dd233214.collapse_all(tr-tr,VS.110).gifBoolean Dizi işlevleri

İşlevleri Array.exists ve Array.exists2bir veya iki dizi öğeleritest sırasıyla. Bu işlevler bir testişlev Al ve iade true bir öğe ise (veya öğe çifti için Array.exists2), koşula uygun.

Aşağıdaki kodu kullanımını gösterir Array.exists ve Array.exists2.Bu örneklerde, bu durumda, işlev bağımsız değişkendeğişkenleri yalnızca birini uygulayarak yeni işlevler oluşturulur.

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

Önceki kodun çıktısı aşağıdaki gibidir.

true
false
false
true

Benzer şekilde, işlevArray.forall her öğenin bir Boolean koşulu karşılayıp karşılamadığını belirlemek için bir dizi test eder. Çeşitleme Array.forall2 eşit uzunlukta iki dizi öğelerini içeren bir Booleanişlev kullanarak, aynı şeyi yapar. Aşağıdaki kod bu işlevlerin kullanılışını gösterir.

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

Bu örnekler çıktı aşağıdaki gibidir.

false
true
true
false

Dd233214.collapse_all(tr-tr,VS.110).gifDiziler aranıyor

Array.Find Booleanişlev alır ve kendisi için işlev verir ilk öğeyi döndürür true, ya da harekete geçiren bir KeyNotFoundException koşulu karşılayan hiçbir öğe bulunursa. Array.findIndex gibi Array.find, öğenin kendisi yerine öğenin dizinini döndürür olmasıdır.

Aşağıdaki kod Array.find ve Array.findIndex tam bir kare ve mükemmel küp numarasını bulmak için.

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

Çıktı aşağıdaki gibidir.

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

Array.tryFind gibi Array.find, bir seçenek türü sonucudur ve verdiği dışında None hiçbir öğe bulunursa.Array.tryFindyerine kullanılması gereken Array.find ne zaman tanımadığınız dizide eşleşen bir öğe olup olmadığını.Benzer şekilde, Array.tryFindIndex gibi Array.findIndex seçenek türü dönüş değeri olan.Hiçbir öğe bulunursa, seçenek, None.

Aşağıdaki kodu kullanımını gösterir Array.tryFind.Bu kod, önceki kod üzerinde bağlıdır.

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

Çıktı aşağıdaki gibidir.

Found an element: 1
Found an element: 729

Use Array.tryPick bir öğenin yanında onu dönüştürmek gerektiğinde.Sonuç, kendisi için işlev verir dönüştürülmüş öğesi bir seçenek değeri olarak ilk öğedir ya da None bu tür bir öğe bulunursa.

Aşağıdaki kod kullanımını gösterir Array.tryPick.Bu durumda, lambda ifadesi yerine, çeşitli yerel yardımcı işlevlerini kodu basitleştirmek için tanımlanır.

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

Çıktı aşağıdaki gibidir.

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.

Dd233214.collapse_all(tr-tr,VS.110).gifDiziler üzerinde hesaplamaları gerçekleştirme

Array.averageişlev ortalama her öğenin bir dizi verir. Tam bölüm türleri kayan nokta ama değil bütünleyici türlerini içeren bir tamsayı, destek öğe türleriyle sınırlıdır.Array.averageByişlev her öğe bir işlev çağırarak sonuçlarını ortalamasını verir. Tamsayı türü bir dizi için kullanabileceğiniz Array.averageBy ve işlevdönüştürmek SD kayan nokta bir yazıda her öğesine sahip.

Use Array.max veya Array.min öğe türü destekliyorsa, maksimum veya minimum öğe almak için.Benzer şekilde, Array.maxBy ve Array.minBy işlev önce yürütülecek, belki de karşılaştırma destekleyen bir türe dönüştürmek için izin vermek.

Array.Sum bir dizinin öğeleri ekler ve Array.sumBy her öğe bir işlev çağırır ve sonuçları bir araya getirir.

yürütmek için dönüş değerlerini saklama olmadan bir dizideki her öğe bir işlev kullanmak Array.iter.Eşit uzunlukta iki dizi ilgilendiren bir işlev için Array.iter2.Ayrıca işlevsonuçlarını dizisi tutmanız gerekiyorsa kullanın dizi.eşleme veya Array.map2, çalıştığı iki dizi üzerinde aynı anda.

Çeşitlemeler Array.iteri ve Array.iteri2 hesaplaması; söz konusu olmasını öğesinin endeksini izin ver Aynı durum Array.mapi ve Array.mapi2.

İşlevleri Array.fold, Array.foldBack, Array.reduce, Array.reduceBack, Array.scan, ve Array.scanBackbir dizinin öğelerini içerenyürütmek algoritmaları. Benzer şekilde, Çeşitlemeler Array.fold2 ve Array.foldBack2 üzerinde iki dizi leştirmek.

Bu işlevler hesaplamaları gerçekleştirmek için aynı adın işlevleri karşılık listesi modül.kullanım örnek için bkz: Listeleri (F#).

Dd233214.collapse_all(tr-tr,VS.110).gifDiziler değiştirme

Array.set bir öğesi için belirtilen bir değere ayarlar.Array.Fill belirtilen değer için bir dizideki öğelerin bir aralık belirler.Aşağıdaki kod örneği sağlar Array.fill.

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

Çıktı aşağıdaki gibidir.

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

Kullanabileceğiniz Array.blit bir dizi alt başka bir diziye kopyalamak için.

Dd233214.collapse_all(tr-tr,VS.110).gifGelen diğer türleri ve dönüştürme

Array.ofList bir listeden bir dizisini oluşturur.Array.ofSeq bir dizi bir dizioluşturur.Array.toList ve Array.toSeqdönüştürmek için bu koleksiyon türleri dizi türü.

Dd233214.collapse_all(tr-tr,VS.110).gifDizileri sıralama

Use Array.sort genel karşılaştırma işlevkullanarak bir dizi sıralamak için.Kullanım Array.sortBy bir değer üreten bir işlev belirtmek için olarak anılacaktır bir anahtar, anahtargenel karşılaştırma işlev kullanarak sıralama için.Use Array.sortWith özel karşılaştırma işlevsağlamak isterseniz.Array.sort, Array.sortBy, ve Array.sortWith tüm sıralanmış bir dizi yeni bir dizi olarak döndürür.Çeşitlemeler Array.sortInPlace, Array.sortInPlaceBy, ve Array.sortInPlaceWith yeni bir dönme yerine varolan diziyi değiştirir.

Dd233214.collapse_all(tr-tr,VS.110).gifDiziler ve dizilerini

İşlevleri Array.zip ve dizi.sıkıştırmayı açmakdizilerini diziler ve kayıt düzeni çiftlerine dizileridönüştürmek . Array.zip3 ve Array.unzip3 üç öğe dizilerini veya dizilerini üç diziler ile çalıştıkları dışında benzer.

Diziler üzerinde paralel hesaplamaları

modülArray.Parallel diziler üzerinde paralel hesaplamaları gerçekleştirmek için işlevler içerir. Bu modül uygulamalarında kullanılabilir değil, hedef sürümleri.net Framework sürüm 4 için önce.

Ayrıca bkz.

Diğer Kaynaklar

F# dil başvurusu

F# türleri