Ich konvertiere ein Array in einen Datensatztyp. Etwas wie:F # Äquivalent von ++ Operator
let value = [|"1";"2";"3";"Not a number";"5"|]
type ValueRecord = {
One: int32
Two: int32
Three: int32
Four: string
Five: int32 }
let convertArrayToRecord (x: string array) =
{ One = x.[0] |> Int.Parse
Two = x.[1] |> Int.Parse
Three = x.[2] |> Int.Parse
Four = x.[3]
Five = x.[4] |> Int.Parse }
let recordValue = convertArrayToRecord value
Dies funktioniert, aber hat den Nachteil, dass das Hinzufügen eines Wertes in die Mitte der Array-Ergebnisse in die manuelle Bearbeitung aller Index Referenzen danach wie folgt aus:
let value = [|"1";"Not a number - 6";"2";"3";"Not a number";"5"|]
type ValueRecord = {
One: int32
Six: string
Two: int32
Three: int32
Four: string
Five: int32 }
let convertArrayToRecord (x: string array) =
{ One = x.[0] |> Int.Parse
Six = x.[1]
Two = x.[2] |> Int.Parse //<--updated index
Three = x.[3] |> Int.Parse //<--updated index
Four = x.[4] //<--updated index
Five = x.[5] |> Int.Parse } //<--updated index
let recordValue = convertArrayToRecord value
Zusätzlich ist es einfach versehentlich die Indizes falsch erhalten.
Die Lösung kam ich mit ist:
let convertArrayToRecord (x: string array) =
let index = ref 0
let getIndex() =
let result = !index
index := result + 1
result
{ One = x.[getIndex()] |> Int.Parse
Six = x.[getIndex()]
Two = x.[getIndex()] |> Int.Parse
Three = x.[getIndex()] |> Int.Parse
Four = x.[getIndex()]
Five = x.[getIndex()] |> Int.Parse }
Dies funktioniert, aber ich mag nicht wirklich die ref Zelle für etwas, das nicht gleichzeitig ist. Gibt es einen besseren/saubereren Weg, dies zu erreichen?
Hmmm, ich bin verwirrt. Ich dachte, wenn man über ein veränderliches Objekt hinwegginge, musste es eine Referenzzelle sein. – mydogisbox
Upside to tun es durch Mustererkennung - wenn Sie die Länge des Arrays ändern und das Muster nicht aktualisieren, erhalten Sie eine Compiler-Warnung, die Sie daran erinnert, es zu beheben. –
@mydogisbox Ab F # 4.0 kannst du veränderbar anstelle von ref verwenden (der Compiler wird es für dich herausfinden, also wird es immer noch auf den Heap gesetzt - genauso wie wenn du ref im Code verwendest). Siehe https://blogs.msdn.microsoft.com/fsharpteam/2014/11/12/announcing-a-preview-of-f-4-0-and-the- visual-f-tools-in-vs-2015 /, Abschnitt namens Vereinfachte Verwendung von veränderbaren Werten – hlo