Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List F函数附加到循环中的列表_List_F# - Fatal编程技术网

List F函数附加到循环中的列表

List F函数附加到循环中的列表,list,f#,List,F#,我希望将此代码转换为使用F list而不是C list实现 我连接到一个数据库并运行一个查询,通常使用C将创建一个类型的列表,并在datareader有值时继续添加该列表。如何将其转换为使用F列表 let queryDatabase (connection: NpgsqlConnection) (queryString: string) = let transactions = new List<string>() let command =

我希望将此代码转换为使用F list而不是C list实现

我连接到一个数据库并运行一个查询,通常使用C将创建一个类型的列表,并在datareader有值时继续添加该列表。如何将其转换为使用F列表

    let queryDatabase (connection: NpgsqlConnection) (queryString: string) =
        let transactions = new List<string>()
        let command = new NpgsqlCommand(queryString, connection)
        let dataReader = command.ExecuteReader()

        while dataReader.Read() do
           let json = dataReader.GetString(1)
           transactions.Add(json)
        transactions

这里需要技巧的是,输入数据源本质上是必需的,您必须调用Read来改变内部状态。因此,你正在从命令式世界过渡到功能性世界——因此你无法避免所有的变异

我可能会使用列表理解来编写代码,它保留了类似的熟悉结构,但删除了显式变异:

let queryDatabase (connection: NpgsqlConnection) (queryString: string) =
  [ let command = new NpgsqlCommand(queryString, connection)
    let dataReader = command.ExecuteReader()
    while dataReader.Read() do
      yield dataReader.GetString(1) ]

这里需要技巧的是,输入数据源本质上是必需的,您必须调用Read来改变内部状态。因此,你正在从命令式世界过渡到功能性世界——因此你无法避免所有的变异

我可能会使用列表理解来编写代码,它保留了类似的熟悉结构,但删除了显式变异:

let queryDatabase (connection: NpgsqlConnection) (queryString: string) =
  [ let command = new NpgsqlCommand(queryString, connection)
    let dataReader = command.ExecuteReader()
    while dataReader.Read() do
      yield dataReader.GetString(1) ]

Tomas的答案是在产品代码中使用的解决方案。但为了学习F和函数式编程,我用and cons运算符展示了我的代码片段:

let drToList (dr:DataReader) =
    let rec toList acc =
        if not dr.Read then acc
        else toList <| dr.GetString(1) :: acc
    toList []

如果我们深入研究,您还应该考虑异常处理。

Tomas的答案是在产品代码中使用的解决方案。但为了学习F和函数式编程,我用and cons运算符展示了我的代码片段:

let drToList (dr:DataReader) =
    let rec toList acc =
        if not dr.Read then acc
        else toList <| dr.GetString(1) :: acc
    toList []

如果我们深入研究,您还应该考虑异常处理。

请参阅运算符。还要注意,C列表是数组的包装器,而F列表是纯链表。F list添加元素的速度非常快,但使用了更多的memorySee操作符。还要注意,C列表是数组的包装器,而F列表是纯链表。F列表添加元素的速度非常快,但使用了更多内存请注意,您的结果将按相反顺序排列。请注意,您的结果将按相反顺序排列。