Ich versuche, einen Dateinamen wie folgt zu konvertieren:

ten_of_clubs.png

Zu

10_of_clubs.png

Meine Implementierung gefällt mir jedoch nicht:

let getFile (card: Card Option) =
    let fileName = 
        match card with
        | Some card -> (getUnionTypeName card.Face + "_of_" + getUnionTypeName card.Suit + ".png").ToLower()
        | None -> ""

    let delimitedName = fileName.Split '_'
    let currentFace = delimitedName.[0]
    let updatedFace = 
        match currentFace with
        | "two" -> "2"
        | "three" -> "3"
        | "four" -> "4"
        | "five" -> "5"
        | "six" -> "6"
        | "seven" -> "7"
        | "eight" -> "8"
        | "nine" -> "9"
        | "ten" -> "10"
        | _ -> currentFace
    updatedFace + "_" + delimitedName.[1] + "_" + delimitedName.[2]

Wie kann ich in F # nur das erste Element einer Zeichenfolge ändern, ohne auf alle Elemente zu verweisen?

Beispiel:

updatedFace + "_" + delimitedName.[1] + "_" + delimitedName.[2]

Zu

updatedFace + "_" + delimitedName.[1..]
f#
1
Scott Nimrod 25 Dez. 2015 im 18:31

2 Antworten

Beste Antwort

Es gibt keinen Grund, zuerst eine formatierte Zeichenfolge zu erstellen, sie dann zu teilen und schließlich eine neue formatierte Zeichenfolge zu erstellen.

Angenommen, Sie möchten die leere Zeichenfolge im Fall None zurückgeben, können Sie Folgendes tun:

let getFile card =
    let digitize candidate = 
        match candidate with
        | "Two" -> "2"
        | "Three" -> "3"
        | "Four" -> "4"
        | "Five" -> "5"
        | "Six" -> "6"
        | "Seven" -> "7"
        | "Eight" -> "8"
        | "Nine" -> "9"
        | "Ten" -> "10"
        | _ -> candidate
    match card with
    | Some c ->
        let face = c.Face |> string |> digitize
        let suit = c.Suit |> string
        sprintf "%s_of_%s.png" face suit
    | None -> ""

Hier habe ich angenommen, dass die Typen Face und Suit ToString überschreiben, anstatt sich auf eine Funktion namens getUnionTypeName zu verlassen, die ich nicht kenne. Dies ermöglicht die Nutzung der eingebauten Funktion string (die einfach ToString () aufruft).

Ad-hoc-Tests:

> Some { Face = Ten; Suit = Clubs } |> getFile;;
val it : string = "10_of_Clubs.png"
> Some { Face = Jack; Suit = Clubs } |> getFile;;
val it : string = "Jack_of_Clubs.png"
> None |> getFile;;
val it : string = ""

Diese digitize -Funktion sieht aus wie ein Kandidat für eine Allzweckfunktion, und ich frage mich, ob in der BCL noch nicht so etwas in ihrem Globalisierungs-Namespace herumliegt ... Ansonsten gibt es sicher Hunderte von NuGet-Paketen, die solche Funktionen implementieren ...


Es stellt sich heraus, dass es nicht Hunderte von NuGet-Paketen gibt, die dies bereits tun. Deshalb habe ich eines mit dem Namen Numsense. Damit können Sie die Funktion getFile folgendermaßen vereinfachen:

open Ploeh.Numsense

let getFile card =
    let digitize candidate = 
        match Numeral.tryParseEnglish candidate with
        | Some i -> string i
        | None -> candidate
    match card with
    | Some c ->
        let face = c.Face |> string |> digitize
        let suit = c.Suit |> string
        sprintf "%s_of_%s.png" face suit
    | None -> ""
3
Mark Seemann 5 Jän. 2016 im 18:51

Nachdem Sie Ihren String durch _ geteilt haben, erhalten Sie eine Reihe von Teilen. Array ist veränderbare Sammlung. Sie können zuerst durch Ihre Funktion ändern und dann erneut durch _ verketten.

let parts = myString.Split [|'_'|]
parts.[0] <- toNumber parts.[0]
String.concat "_" parts
2
Bartek Kobyłecki 25 Dez. 2015 im 15:49