Quiero extraer un único elemento de una secuencia en F #, o dar un error si no hay ninguno o más. ¿Cuál es la mejor manera de hacer esto?Extraer un solo elemento de la lista en F #
Actualmente tengo
let element = data |> (Seq.filter (function | RawXml.Property (x) -> false | _ -> true))
|> List.of_seq
|> (function head :: [] -> head | head :: tail -> failwith("Too many elements.") | [] -> failwith("Empty sequence"))
|> (fun x -> match x with MyElement (data) -> x | _ -> failwith("Bad element."))
parece que funciona, pero ¿es realmente la mejor manera?
Edit: Como me señaló en la dirección correcta, me ocurrió lo siguiente:
let element = data |> (Seq.filter (function | RawXml.Property (x) -> false | _ -> true))
|> (fun s -> if Seq.length s <> 1 then failwith("The sequence must have exactly one item") else s)
|> Seq.hd
|> (fun x -> match x with MyElement (_) -> x | _ -> failwith("Bad element."))
supongo que es un poco más agradable.
¿Puede proporcionar una secuencia de muestras y lo que está buscando? –
No me parece necesario. Quiero encontrar el primer valor y dar un error si hay más de uno. Eso es todo – erikkallen
+1 - quiere un F # equivalente a un operador LINQ útil (System.Linq.Enumerable.Single) - ¡normalmente es al revés! –