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..]
2 Antworten
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 -> ""
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
Neue Fragen
f#
F # ist eine prägnante, ausdrucksstarke und effiziente funktionale und objektorientierte Sprache für .NET, mit der Sie einfachen Code schreiben können, um komplexe Probleme zu lösen.