F#使用while循环

mam*_*amu 9 f#

我有一个datareader,我想从它返回行集,在阅读了一天的书后,我无法找到在f#中做到最好的方法.我可以在F#中做正常的C#方式,但这不是我使用f#的原因

这是我想要实现的目标

let values =
    while reader.Read() do
        yield reader.GetString(0), reader.GetInt64(1)
Run Code Online (Sandbox Code Playgroud)

以上是我的尝试方式

  • 所有值都被收集到值中,这些值可以是dictinary或元组或任何集合
  • yield不能用于while循环,但这正是我想要做的

什么是实现这一目标的最佳方式

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)


Mau*_*Mau 7

您可以使用序列表达式来实现枚举器:

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)