2010-03-10 40 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