我有一个datareader,我想从它返回行集,在阅读了一天的书后,我无法找到在f#中做到最好的方法.我可以在F#中做正常的C#方式,但这不是我使用f#的原因
这是我想要实现的目标
let values =
while reader.Read() do
yield reader.GetString(0), reader.GetInt64(1)
Run Code Online (Sandbox Code Playgroud)
以上是我的尝试方式
什么是实现这一目标的最佳方式
gra*_*bot 14
F#还提供了数组和序列的列表推导.
let records_as_list =
[
while reader.Read()
do yield (reader.GetString(0), reader.GetInt64(1))
]
let records_as_array =
[|
while reader.Read()
do yield (reader.GetString(0), reader.GetInt64(1))
|]
let records_as_sequence =
seq {
while reader.Read()
do yield (reader.GetString(0), reader.GetInt64(1))
}
Run Code Online (Sandbox Code Playgroud)
F#内置了一个方便的字典函数调用 dict
let records_as_IDictionary = dict records_as_sequence
Run Code Online (Sandbox Code Playgroud)
您可以使用序列表达式来实现枚举器:
let records = seq { while reader.NextResult() do yield (reader.GetString(0), reader.GetInt64(1)) }
Run Code Online (Sandbox Code Playgroud)
如果您需要两个以上的字段,则可以生成列索引(或名称) - >字段值(未测试代码)的映射:
let dbSchema = reader.GetSchemaTable()
let makeMap (rdr : IDataReader) (schema : DataTable) =
schema.Columns |> Seq.cast<DataColumn> |> Seq.map (fun col -> (col.ColumnName, rdr.[col.ColumnName])) |> Map.ofSeq
let records = seq { while reader.NextResult() do yield (makeMap reader dbSchema) }
Run Code Online (Sandbox Code Playgroud)