2016-03-31 5 views
10

मैं अपने नेस्टेड फॉर-लूप को और अधिक कार्यात्मक शैली में बदलने की कोशिश कर रहा हूं।एफ # - नेस्टेड फॉर-लूप को एक कार्यात्मक शैली में परिवर्तित करना

मैं पाइपलाइनिंग, अनुक्रमों और सरणी के साथ गड़बड़ कर रहा हूं, लेकिन इसका कोई फायदा नहीं हुआ।

let allCarrierCodes = new List<string>()  
for result in getAllCarrierCodesResults do 
     for carrierCode in result do 
      allCarrierCodes.Add(carrierCode.ToString()) 
  • getAllCarrierCodesResults प्रकार के "obj सूची"

एक अच्छा कार्यात्मक तरीका करने के लिए नेस्टेड छोरों फिर से लिखें क्या है एक seq है:

यहाँ मैं क्या है क्या है?

धन्यवाद।

+0

नेस्टेड लूप को फिर से लिखने के अलावा, "सामान्य" सूची ('System.Collections.Generic.List') से F # सूचियों में स्विच करने पर विचार करें, जो कि अपरिवर्तनीय हैं। यह आपको पैटर्न F मिलान जैसे सभी F # उपहारों तक पहुंच प्रदान करेगा। नीचे ली के उत्तर के साथ, यह 'सभी कोड = getAllCarriesCodes |> Seq.concat |> Seq.map स्ट्रिंग |> List.ofSeq' –

उत्तर

10

आप Seq.collect उपयोग कर सकते हैं:

let allCodes = Seq.collect id getAllCarrierCodesResults 
       |> Seq.map string) 

या

let allCodes = Seq.collect (Seq.map string) getAllCarrierCodesResults 

आप तो ठोस संग्रह आप चाहते हैं जिसके परिणामस्वरूप seq<string> बदल सकते हैं।

+0

' Seq.collect id' लिखने के बजाय, मैं 'Seq.concat 'का उपयोग करूंगा । –

+0

इसके अलावा, आप F # 4 में नई सुविधा का उपयोग कर सकते हैं, जहां [रचनाकारों को प्रथम श्रेणी के कार्यों के रूप में उपयोग किया जा सकता है] (https://github.com/fsharp/FSharpLangDesign/blob/master/FSharp-4.0/ClassNamesAsFunctionsDesignAndSpec। एमडी)। इसके साथ, आप 'ऑलकोड्स = getAllCarriesCodes |> Seq.concat |> Seq.map स्ट्रिंग |> सूची' सूची के उपयोग के लिए, ऊपर मेरी टिप्पणी देखें। –

8

ली की जवाब इस से बेहतर है, लेकिन मैं सिर्फ इतना है कि आप पूरी तरह से सिर्फ एक सूची समझ अंदर उन नेस्ट छोरों डाल सकते हैं उल्लेख करना चाहता था, और देखा:

let allCarrierCodes = 
    [for result in getAllCarrierCodesResults do 
    for carrierCode in result do 
     yield carrierCode.ToString()] 

जरूरी-ish की तरह लग रहा है, लेकिन है वास्तव में कार्यात्मक।

इसके अलावा, आपको carrierCode.ToString() के बजाय string carrierCode का उपयोग करना चाहिए। आपको एनआरई से बचाता है और अतिरिक्त बोनस के लिए अधिक कार्यात्मक दिखता है :-)

+0

यदि आप '.ToString()' का उपयोग न करने के बारे में सलाह देते हैं, तो आप इसे अपने उत्तर में क्यों उपयोग करते हैं? – knocte

+0

ओपी के कोड के जितना संभव हो सके इसे रखने के लिए। –

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