2010-03-10 36 views
2

我從第三方API獲取數據,這些數據只是給了我一個System.Object,我知道它是一個double []。爲了處理這種返回類型,我發現下面的代碼可以很好地工作。但是,我還找回了一些也僞裝成System.Object的int []數組,具體日期形式爲YYYYMMDD(例如20100310)。如何將System.Object的確是一個int32 []轉換爲double []?

轉換爲浮動失敗,它只是說,指定的轉換無效。有沒有人知道如何讓這項工作的整數?

let oIsNull (obj : System.Object) = obj = null 
let oIsArray (obj : System.Object) = obj.GetType().IsArray 

let o2f (obj : System.Object) = 
    let mutable arr = [|Double.NaN|] 
    if (oIsNull obj = false) && (oIsArray obj = true) then 
     let objArr = obj :?> obj[] 
     let u = objArr.GetUpperBound(0) 
     let floatArr : float[] = Array.zeroCreate (u + 1); 
     for i in 0..u do 
      if objArr.[i] = null then 
       floatArr.[i] <- Double.NaN 
      else 
       let t = objArr.[i].GetType() 
       floatArr.[i] <- objArr.[i] :?> float 
      //else floatArr.[i] <- float objArr.[i] 
     arr <- floatArr 
    arr 

回答

7

你的意思是你想

floatArr.[i] <- float (objArr.[i] :?> int) 

做對象轉換爲int進而推動浮動?

事實上,你將得到更好的使用模式沿線

open System 

let o2f (obj : System.Object) = 
    match obj with 
    | :? array<float> as arr -> arr 
    | :? array<int> as irr -> irr |> Array.map float 
    | _ -> [|Double.NaN|] 
+0

有趣的類型匹配服務 - 我想這正是我想要做的事。謝謝,這是有效的。 – 2010-03-10 21:25:49

+0

我喜歡模式匹配的例子。非常感謝。 – 2010-03-10 23:22:27

+0

在這種情況下,我可能會更喜歡使用'Array.map',它可能比'Seq.map'後跟'toArray'更有效(因爲它可以預先以正確的長度分配返回的數組)。 – 2010-03-10 23:56:24

相關問題