Như Rex nhận xét, nếu bạn muốn điều này chỉ cho hai trường hợp, sau đó bạn có thể sẽ không có bất kỳ vấn đề nếu bạn để lại mã như nó được. Tuy nhiên, nếu bạn muốn trích xuất một mẫu chung, thì bạn có thể viết một hàm chia danh sách thành danh sách phụ có độ dài được chỉ định (2 hoặc 3 hoặc bất kỳ số nào khác). Khi bạn làm điều đó, bạn sẽ chỉ sử dụng map
để biến từng danh sách có độ dài được chỉ định thành Vector
.
Chức năng tách danh sách không khả dụng trong thư viện F # (theo như tôi có thể biết), vì vậy bạn sẽ phải tự thực hiện nó. Nó có thể được thực hiện gần như thế này:
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
Bây giờ, bạn có thể sử dụng chức năng này để thực hiện hai chuyển đổi của bạn như thế này:
seq { for [x; y] in floatList |> divideList 2 -> Vector2(x,y) }
seq { for [x; y; z] in floatList |> divideList 3 -> Vector3(x,y,z) }
này sẽ cung cấp một cảnh báo, bởi vì chúng tôi đang sử dụng không đầy đủ mô hình mong rằng các danh sách được trả về sẽ có độ dài 2 hoặc 3 tương ứng, nhưng đó là kỳ vọng chính xác, vì vậy mã sẽ hoạt động tốt. Tôi cũng đang sử dụng phiên bản ngắn gọn của biểu thức trình tự->
thực hiện tương tự như do yield
, nhưng nó chỉ có thể được sử dụng trong các trường hợp đơn giản như thế này.
Nguồn
2010-02-14 02:51:11
trông khá sạch sẽ với tôi, tôi không nghĩ rằng bạn sẽ gặp phải vấn đề về bảo trì –
Bạn có thể viết mã chung có thể lấy N mục và sau đó chỉ cần sử dụng kết hợp để chọn 'Vector3' hoặc 'Vector2 '(thích hợp), nhưng tại sao? Chi phí sẽ phức tạp hơn những gì bạn có ở đây. Bây giờ, nếu bạn đi tất cả các con đường lên đến 12, đó là một câu chuyện .... –