2010-05-06 3 views

cevap

12

Not o F # içinde daha deyimsel bir yaklaşım olur büyük olasılıkla geri dönmesinden beri bir düşüş olmasa da, LINQ operatörlerini kullanmak yerine Seq.tryFind satırları boyunca bir şey kullanmak olabilir bir seçenek değeri.

+1

: olarak kullanma

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

: Ben imza seq<'a> -> option<'a> olan bir işlev tryHead tanımlarsınız değerler (çünkü tehlikelidirler). 'Option.map' ve onlarla çalışmak için diğer işlevleri de kullanabileceğinden, seçenek değerlerini kullanmak daha kolaydır (ancak, bu muhtemelen SQL'de F # LINQ içinde çalışmayacaktır) –

+0

Yep, Seq.tryFind (fun _ -> true)) harika çalışıyor. –

3

Alternatif olarak, kolayca kendi FirstOrDefault tanımlayabilirsiniz:

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

Örnek: Seq modül zaten head işlevi vardır

firstordefault exampleList;; 
val it : int = 1 
7

Çünkü

interaktif F # kullanarak
let exampleList = [ 1; 2; 3 ] 

, seq<'a> -> 'a türünde F #, genellikle kullanarak aviod deneyin `null` -

[1; 2; 3] |> Seq.tryHead 
Ben de Seq.tryFind`` kullanarak tavsiye ediyorum
+2

O zamandan beri 'tryHead' (https://github.com/Microsoft/visualfsharp/commit/b10392dc16593bf9286583e2a87217d18fa18b8a) F # 4.0'a eklenmiştir. –