2016-03-31 22 views
10

İç içe geçmiş döngülerimi daha işlevsel bir biçime dönüştürmeye çalışıyorum.F # - İç içe geçmiş döngüleri işlevsel bir stile dönüştürme

Pipeline, diziler ve dizilerle uğraştım ama boşuna.

let allCarrierCodes = new List<string>()  
for result in getAllCarrierCodesResults do 
     for carrierCode in result do 
      allCarrierCodes.Add(carrierCode.ToString()) 
  • getAllCarrierCodesResults "obj listesi"

iç içe döngüler yeniden yazmak için güzel bir işlevsel yolu nedir türde bir seq: İşte

Elimde ne var?

Teşekkürler.

+0

İç içe döngüyü yeniden yazmanın yanı sıra, "normal" Listeden ('System.Collections.Generic.List') F # listelerine geçiş yapmayı düşünebilirsiniz. değişmezdir. Bu desen eşleme gibi tüm F # goodies erişmenizi sağlayacaktır. Lee'nin cevabı aşağıdadır: 'allCodes = getAllCarriesCodes |> Seq.concat |> Seq.map string |> List.ofSeq' –

cevap

10

Sen Seq.collect kullanabilirsiniz:

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

veya

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

sonra istediğiniz beton koleksiyonuna çıkan seq<string> dönüştürebilirsiniz.

+0

'Seq.collect id' yazmak yerine' Seq.concat' kullanıyorum. . –

+0

Ayrıca, [kurucuların birinci sınıf işlevler olarak kullanılabildiği] F # 4'teki yeni özelliği kullanabilirsiniz (https://github.com/fsharp/FSharpLangDesign/blob/master/FSharp-4.0/ClassNamesAsFunctionsDesignAndSpec. md). Bununla birlikte, '' allCodes = getAllCarriesCodes |> Seq.concat |> Seq.map string |> List 'yazabilirsiniz. Listenin kullanımı için yukarıdaki yorumuma bakın. –

8

Lee'nin cevabı bu daha iyidir, ama sadece tamamen adil bir liste anlayışı içine bu yuvalanmış döngüler koyabilirsiniz söz istedim ve işte:

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

şart-ish tür görünüyor, ama bir gerçekten işlevsel. Ayrıca, carrierCode.ToString() yerine string carrierCode kullanmalısınız. NRE'den sizi korur ve eklenen bonus için daha işlevsel görünüyor :-)

+0

, '.ToString()' i kullanmadığınız konusunda tavsiyede bulunuyorsanız, neden cevabınızda kullanıyorsunuz? – knocte

+0

OP'nin koduna mümkün olduğunca yakın tutmak için. –

İlgili konular