2011-01-24 16 views
7

मैं आईडी है कि मैं एक साथ विलय करने के लिए, आईडी के आधार पर चाहते हैं के एक सामान्य सेट के साथ 4 विभिन्न स्रोतों से डेटा के एकाधिक सूचियों, मूल रूप से एक नई सूची से समाप्त कर दिया है, प्रत्येक आईडी और प्रत्येक स्रोत के लिए एक एकल प्रवेश के लिए एक।डेटा के एकाधिक सूचियों मर्ज एक साथ एफ # में आम आईडी के आधार पर

type data = {ID : int; value : decimal;} 

इसलिए, उदाहरण के लिए मैं होगा::

let sourceA = [data1, data2, data3]; 
let sourceB = [data1, data2, data3]; 
let sourceC = [data1, data2, data3]; 
let sourceD = [data1, data2, data3]; 

(मुझे पता है यह कोड नहीं है

4 स्रोतों में से प्रत्येक से आउटपुट सूची में वस्तुओं कुछ इस तरह दिखाई वैध, बस एक बुनियादी विचार देने की कोशिश कर रहा है ... सूचियों को वास्तव में खींच लिया जाता है और डेटाबेस से उत्पन्न होता है)

मैं फिर स्रोत ए, स्रोत बी, स्रोतसी और स्रोत डी लेना चाहता हूं और उन्हें संसाधित करना चाहता हूं युक्त एक सूची में कुछ इस तरह की वस्तुओं:

type dataByID = {ID : int; valueA : decimal; valueB : decimal; valueC : decimal; valueD : decimal; } 

... ताकि मैं फिर उन्हें बाहर एक सीएसवी में, आईडी और coulmns 2 जा रहा है मुद्रित कर सकते हैं पहले कॉलम के साथ - 5 स्रोतों एक से डेटा जा रहा है - डी उस पंक्ति में आईडी के साथ संगत।

मैं एफ # के लिए बिल्कुल नया हूं, तो इस डेटा को संसाधित करने का सबसे अच्छा तरीका क्या होगा ताकि मैं आईडी द्वारा सभी स्रोत डेटा मानों को मेल करूं ??

उत्तर

8

ऐसा लगता है कि आप बस सभी सूचियों को जोड़ सकते हैं और फिर सूची सूची में अद्वितीय आईडी और आईडी से जुड़े सभी मूल्यों वाली एक सूची प्राप्त करने के लिए Seq.groupBy का उपयोग कर सकते हैं। कुछ इस तरह उपयोग किया जा सकता:

let data = 
    [ data1; data2; data3; data4 ] // Create list of lists of items 
    |> Seq.concat     // Concatenate to get a single list of items 
    |> Seq.groupBy (fun d -> d.ID) // Group elements by ID 

seq { for id, values in data -> 
     // ID is the id and values is a sequence with all values 
     // (that come from any data source) } 

आप स्रोत संबद्ध करना चाहते हैं (चाहे वह डेटा स्रोत के एक सूचकांक से जोड़ने के लिए था data1, data2, etc...) with the value then you can first use map` आपरेशन:

let addIndex i data = 
    data |> Seq.map (fun v -> i, v) 

let data = 
    [ List.map (addIndex 1) data1; 
    List.map (addIndex 2) data2; 
    List.map (addIndex 3) data3; 
    List.map (addIndex 4) data4 ] 
    |> Seq.concat 
    |> Seq.groupBy (fun (index, d) -> d.ID) 

अब, data भी डेटा स्रोत (1 से 3) के सूचकांक में शामिल है, इसलिए जब मूल्यों पर पुनरावृत्ति, आप सूचकांक का उपयोग कर सकते हैं जो डेटा स्रोत आइटम से। यहां तक ​​कि अच्छे संस्करण सूची पर दोहराने में Seq.mapi का उपयोग कर लिखा जा सकता है आता है से पता लगाने के लिए डेटा स्रोतों की और स्वचालित रूप से सभी मूल्यों को सूचकांक जोड़ें:

let data = 
    [ data1; data2; data3; data4 ] 
    |> Seq.mapi (fun index data -> Seq.map (addIndex index) data) 
    |> Seq.concat 
    |> Seq.groupBy (fun (index, d) -> d.ID) 
+0

जैसा कि मैंने कहा, बिल्कुल एफ # के लिए नया ... मुझे लगता है कि मुझे मूल विचार मिलता है, लेकिन एक त्वरित कोड उदाहरण बेहद सहायक होगा। –

+0

@Adam: जोड़ा कुछ उदाहरण :-) –

संबंधित मुद्दे

 संबंधित मुद्दे