【问题标题】:How to convert System.Object that's really an int32[] to a double[]?如何将实际上是 int32[] 的 System.Object 转换为 double[]?
【发布时间】:2010-03-12 11:50:27
【问题描述】:

我从第 3 方 API 获取数据,该 API 只返回一个 System.Object,我知道它是一个双重 []。为了处理这种返回类型,我发现下面的代码可以很好地工作。但是,我还得到了一些也伪装成 System.Object 的 int[] 数组,特别是 YYYYMMDD 格式的日期(例如 20100310)。

转换为浮点数失败,它只是说指定的强制转换无效。有没有人知道如何使它适用于整数?

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

【问题讨论】:

    标签: f#


    【解决方案1】:

    你的意思是你想要

    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|]
    

    【讨论】:

    • 有趣 - 我想这正是我想要做的。谢谢,那行得通。
    • 我喜欢模式匹配的例子。非常感谢。
    • 在这种情况下,我可能更喜欢使用Array.map,它可能比Seq.map 后跟toArray 更有效(因为它可以提前分配返回的数组以正确的长度) .
    • 我是否遗漏了什么——最后一行不应该是 | _ -> [|Double.NaN|] 你没有错过最后的“]”吗?
    • 是的,你是对的——来自 OP 的剪切和粘贴缺陷。我会修复它。
    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 2015-12-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多