Wie Rex kommentierte, wenn Sie dies nur für zwei Fälle wollen, dann haben Sie wahrscheinlich kein Problem, wenn Sie den Code so lassen wie er ist. Wenn Sie jedoch ein gemeinsames Muster extrahieren möchten, können Sie eine Funktion schreiben, die eine Liste in eine Unterliste einer bestimmten Länge aufteilt (2 oder 3 oder eine andere Zahl). Sobald Sie dies getan haben, verwenden Sie nur map
, um jede Liste der angegebenen Länge in Vector
umzuwandeln.
Die Funktion zum Aufteilen der Liste ist in der F # -Bibliothek nicht verfügbar (soweit ich das beurteilen kann), Sie müssen sie also selbst implementieren.
let divideList n list =
// 'acc' - accumulates the resulting sub-lists (reversed order)
// 'tmp' - stores values of the current sub-list (reversed order)
// 'c' - the length of 'tmp' so far
// 'list' - the remaining elements to process
let rec divideListAux acc tmp c list =
match list with
| x::xs when c = n - 1 ->
// we're adding last element to 'tmp',
// so we reverse it and add it to accumulator
divideListAux ((List.rev (x::tmp))::acc) [] 0 xs
| x::xs ->
// add one more value to 'tmp'
divideListAux acc (x::tmp) (c+1) xs
| [] when c = 0 -> List.rev acc // no more elements and empty 'tmp'
| _ -> failwithf "not multiple of %d" n // non-empty 'tmp'
divideListAux [] [] 0 list
Jetzt, können Sie diese Funktion verwenden können, um zwei Conversions wie dies zu realisieren: Es lassen sich grob wie folgt durchgeführt werden
seq { for [x; y] in floatList |> divideList 2 -> Vector2(x,y) }
seq { for [x; y; z] in floatList |> divideList 3 -> Vector3(x,y,z) }
Dies gibt eine Warnung aus, weil wir ein unvollständiges verwenden Muster, das erwartet, dass die zurückgegebenen Listen die Länge 2 bzw. 3 haben, aber das ist richtige Erwartung, so wird der Code gut funktionieren. Ich verwende auch eine kurze Version von Sequenzausdruck die ->
tut das gleiche wie do yield
, aber es kann nur in einfachen Fällen wie diesem verwendet werden.
sieht ziemlich sauber zu mir, ich glaube nicht, dass Sie in ein Wartbarkeit Problem führen werde –
Sie generischen Code schreiben könnte, die N Elemente greifen konnte und dann nur Spiel benutzen, um 'Vector3' auszusuchen oder' Vector2 '(wie passend), aber warum? Der Aufwand wäre komplizierter als das, was Sie hier haben. Nun, wenn du den ganzen Weg bis zu 12 gehst, ist das eine andere Geschichte .... –