F# F.添加列表

F# F.添加列表,f#,f#-interactive,f#-data,fsharp.data.sqlclient,F#,F# Interactive,F# Data,Fsharp.data.sqlclient,如何将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 Se

如何将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”不支持运算符“+”

,因为
行。[i]
返回类型
obj
,您的
u
v
变为
seq
,因此您的
a
b
变为类型
列表,因此,
x
y
被推断为具有类型
obj
,当然,您不能添加两个
obj
,这正是编译器告诉您的

如果确定
行[0]
行[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 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
或:

p.p.S另外,您的
Seq
调用列表似乎是浪费,因为
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

因为
row.[i]
返回类型
obj
,你的
u
v
变成
seq
,因此你的
a
b
变成类型
列表
,因此
x
y
被推断为类型
obj
,当然,你不能添加两个
obj
,这正是编译器告诉你的

如果确定
行[0]
行[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 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
或:

p.p.S另外,您的
Seq
调用列表似乎是浪费,因为
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

您可以尝试在
let a=List.ofSeq(Seq.cast u)
let b=
中使用
Seq.cast
您可以尝试在
let a=List.ofSeq(Seq.cast u)
let b=/code>中使用
,我刚刚意识到查询中的一些值为null。感谢您的解释,我刚刚意识到查询中的一些值为null。