F锐利添加清单

Haa*_*Daz 1 f# f#-interactive f#-data fsharp.data.sqlclient

如何将obj列表转换为int类型.我试图使用下面的地图函数添加两个列表,但它不适用于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
Run Code Online (Sandbox Code Playgroud)

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

Fyo*_*kin 5

因为row.[i]返回一个类型obj,你uv成为seq<obj>,因此你ab成为类型List<obj>,因此xy被推断为有型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
Run Code Online (Sandbox Code Playgroud)

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

let c = List.map2 (fun x y-> (x :?> int) + (y :?> int)) a b
Run Code Online (Sandbox Code Playgroud)

要么:

let a= u |> Seq.cast<int> |> List.ofSeq
let b= v |> Seq.cast<int> |> List.ofSeq
Run Code Online (Sandbox Code Playgroud)

但我喜欢第一个最好的例子,因为它在最早的已知点应用了强制转换,并且产生了最少量的额外代码.

但要注意:如果row.[0]结果不是int在运行时,你会得到一个InvalidCastException.

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

List.map2 (+) a b
Run Code Online (Sandbox Code Playgroud)

PPS此外,您的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
Run Code Online (Sandbox Code Playgroud)

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

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