【问题标题】:F sharp adding lists升 F 添加列表
【发布时间】:2015-05-20 14:21:10
【问题描述】:

如何将 obj 列表转换为 int 类型。我正在尝试使用下面的 map 函数添加两个列表,但它不适用于 obj 列表。

let query f= 
 seq{
let cmd = new OleDbCommand( "SELECT *  FROM F" );
let conn = new OleDbConnection( @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=D:\Users\df\Documents\Vfolio.accdb;
Persist Security Info=False;" )

conn.Open()
let DAdapt = new OleDbDataAdapter("SELECT * FROM F",conn)
let DTab = new DataSet()
let i= DAdapt.Fill(DTab)
let rowCol = DTab.Tables.[0].Rows
let rowCount = rowCol.Count
 for i in 0 .. (rowCount - 1) do
           yield f (rowCol.[i])
   }
 let u= query(fun row -> row.[0])
 let a= List.ofSeq u
 let v=query(fun row -> row.[1])
 let b= List.ofSeq v
 let c = List.map2 (fun x y-> x + y) a b

错误信息:'obj' 类型不支持运算符'+'

【问题讨论】:

  • 你可以尝试在let a= List.ofSeq (Seq.cast<int> u)let b = 中使用Seq.cast

标签: f# f#-interactive f#-data fsharp.data.sqlclient


【解决方案1】:

因为row.[i] 返回类型obj,所以您的uv 变成seq<obj>,因此您的ab 变成类型List<obj>,因此x 和@987 @ 被推断为具有obj 类型,当然,你不能添加两个objs,这正是编译器告诉你的。

如果您确定 row.[0]row.[1] 是某种数字,您应该应用适当的演员表,例如:

let u= query(fun row -> row.[0] :?> int)
let a= List.ofSeq u
let v=query(fun row -> row.[1] :?> int)
let b= List.ofSeq v
let c = List.map2 (fun x y-> x + y) a b

您也可以在其他地方应用此演员表,具体取决于您的品味和要求,例如:

let c = List.map2 (fun x y-> (x :?> int) + (y :?> int)) a b

或者:

let a= u |> Seq.cast<int> |> List.ofSeq
let b= v |> Seq.cast<int> |> List.ofSeq

但我最喜欢第一个示例,因为它在已知最早的时间点应用强制转换并产生最少的额外代码。

但请注意:如果 row.[0] 在运行时不是 int,您将获得 InvalidCastException

P.S.在您的 List.map2 调用中,您可以直接指定 (+) 而不是将其包装在额外的 lambda 中:

List.map2 (+) a b

P.P.S另外,您的List.ofSeq 调用似乎很浪费,因为Seq 也有一个map2

let u = query(fun row -> row.[0] :?> int)
let v = query(fun row -> row.[1] :?> int)
let c = Seq.map2 (+) u v |> List.ofSeq

P.P.P.S 另外,您是否注意到对query 的两次调用都生成了自己的数据库连接、命令、适配器和数据集?您是打算这样做还是您的意思是只有一个连接,然后从结果中获取不同的列?如果是这样,您应该只调用一次query

let c = query( fun row -> (row.[0] :?> int) + (row.[1] :?> int) ) |> List.ofSeq

【讨论】:

  • 谢谢你的解释,我才发现查询中有些值是空的。
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多