F# F.添加列表
如何将obj列表转换为int类型。我正在尝试使用下面的map函数添加两个列表,但它在obj列表上不起作用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
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。