2010-05-06 14 views

risposta

12

Si noti che un approccio più idiomatica all'interno di F # sarebbe probabilmente usare qualcosa sulla linea Seq.tryFind piuttosto che utilizzare gli operatori LINQ, sebbene non si tratti di una sostituzione in quanto restituisce un valore di opzione.

+1

Vorrei anche raccomandare usando 'Seq.tryFind' - in F #, in genere si cerca di aviod usando' null' valori (perché sono pericolosi). Gestire i valori delle opzioni è più semplice, dato che puoi anche usare 'Option.map' e altre funzioni per lavorare con loro (anche se probabilmente non funzionerà in F # LINQ su SQL) –

+0

Sì,' Seq.tryFind (fun _ -> true) 'funziona alla grande –

3

In alternativa, è possibile definire il proprio FirstOrDefault facilmente:

let firstordefault list = 
    match list with 
    | head :: tail -> head 
    | [] -> 0 // some default value 

Esempio:

let exampleList = [ 1; 2; 3 ] 

utilizzando F # interattivo,

firstordefault exampleList;; 
val it : int = 1 
7

Poiché il modulo Seq ha già una funzione head di tipo seq<'a> -> 'a, Vorrei definire una funzione con la firma tryHeadseq<'a> -> option<'a>:

module Seq = 
    let tryHead (ls:seq<'a>) : option<'a> = ls |> Seq.tryPick Some 

usando come:

[1; 2; 3] |> Seq.tryHead 
+2

Da allora 'tryHead' (https://github.com/Microsoft/visualfsharp/commit/b10392dc16593bf9286583e2a87217d18fa18b8a) è stato aggiunto in F # 4.0. –