2010-05-06 20 views
8

में फर्स्टऑर्डडिफॉल्ट F # में FirstOrDefault Linq क्वेरी कैसे लिखें? क्या मैं पूरी तरह से एफ # में एसक्यूएल के लिए linq का उपयोग कर सकता हूं?एफ #

उत्तर

12

ध्यान दें कि एफ # के भीतर अधिक मुहावरेदार दृष्टिकोण होगा शायद LINQ ऑपरेटरों का उपयोग करने के बजाय Seq.tryFind की लाइनों के साथ कुछ उपयोग करना होगा, हालांकि यह प्रतिस्थापन में गिरावट नहीं है क्योंकि यह लौटाता है एक विकल्प मूल्य।

+1

मैं भी का उपयोग कर 'Seq.tryFind' की सिफारिश करेंगे - एफ # में, आप आमतौर पर उपयोग करते हुए aviod करने की कोशिश' null' मूल्य (क्योंकि वे खतरनाक हैं)। विकल्प विकल्प को संभालना आसान है क्योंकि आप 'Option.map' और उनके साथ काम करने के लिए अन्य फ़ंक्शंस का भी उपयोग कर सकते हैं (हालांकि, यह शायद F # LINQ से SQL में काम नहीं करेगा) –

+0

हाँ, 'Seq.tryFind (fun _ -> true) 'महान काम करता है। –

3

वैकल्पिक रूप से, आप अपने खुद के FirstOrDefault आसानी से परिभाषित कर सकते हैं:

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

उदाहरण:

let exampleList = [ 1; 2; 3 ] 

एफ # इंटरैक्टिव का उपयोग कर,

firstordefault exampleList;; 
val it : int = 1 
7

क्योंकि Seq मॉड्यूल पहले से ही एक head कार्य है seq<'a> -> 'a टाइप करें, मैं हस्ताक्षर seq<'a> -> option<'a> के साथ एक समारोह tryHead निर्धारित करना होगा:

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

के रूप में उपयोग:

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

तब से 'tryHead' (https://github.com/Microsoft/visualfsharp/commit/b10392dc16593bf9286583e2a87217d18fa18b8a) F # 4.0 में जोड़ा गया है। –