Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
F#使用数据读取器_F# - Fatal编程技术网

F#使用数据读取器

F#使用数据读取器,f#,F#,我有上面的代码从datareader读取字节[] getBytesData函数接受读取器并从读取器返回字节[] 一切正常,但getBytesData函数的工作方式非常不正常 我创建零填充字节数组只是为了创建数组,有没有办法创建动态扩展或固定长度数组 有什么方法可以在F#中进行优化吗? 很抱歉提出这样的问题,但我已经开始了一个关于F#的新项目,以榨取其中的所有果汁,所以根据我的经验,尝试以最理想的方式获得每一行是最好的方式。与本机.Net方法交互需要使用一些empritiviley(因此|>i

我有上面的代码从datareader读取字节[]

getBytesData函数接受读取器并从读取器返回字节[]

  • 一切正常,但getBytesData函数的工作方式非常不正常
  • 我创建零填充字节数组只是为了创建数组,有没有办法创建动态扩展或固定长度数组
有什么方法可以在F#中进行优化吗?


很抱歉提出这样的问题,但我已经开始了一个关于F#的新项目,以榨取其中的所有果汁,所以根据我的经验,尝试以最理想的方式获得每一行是最好的方式。与本机.Net方法交互需要使用一些empritiviley(因此|>ignore),因此封装在函数中,然后使用fn作为函数编程的一部分。如果您感兴趣,我已经问了一些关于在F#中使用.Net方法的问题


另外,还要确保在以后处理读取器。
IDataReader
GetBytes
方法实际上没有提供任何选项来以更有效的方式编写代码(它需要一个它想要修改的数组,所以我们只需给它一些数组…)

因此,您的代码版本是完美的-即使它不是完全功能性的,您至少可以在单个函数中保持命令部分的本地化,并保持程序的其余部分功能性(这是一个很好的结果)

我在您的代码中所做的唯一更改是将
阅读器
移动到序列理解(以使其更本地化),并使用
使用
关键字以确保它得到正确处理(此外,序列表达式中不需要
列表
标识符):


使用零初始化数组不是问题-所有CLR数组在分配时都是零初始化的,没有任何选项可以在以后“填充”一个单元化数组。
let reader = selectCommand.ExecuteReader()

let getBytesData (x : IDataReader) = 
    let len = reader.GetBytes(1, int64 0, null, 0, 0);
    // Create a buffer to hold the bytes, and then
    // read the bytes from the DataTableReader.
    let buffer : byte array = Array.zeroCreate (int32 len)
    x.GetBytes(1, int64 0, buffer, 0, int32 len) |> ignore
    buffer

let retVal = 
  List [ while reader.Read() do 
           yield (reader.GetString(0), getBytesData reader, 
                  reader.GetDateTime(2)) ]
let retVal =  
  [ use reader = selectCommand.ExecuteReader() 
    while reader.Read() do  
      yield (reader.GetString(0), getBytesData reader,  reader.GetDateTime(2)) ]