2010-06-06 2 views
4
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)) ] 

위의 코드는 datareader에서 bytes []를 읽습니다.F # DataReader 작업

getBytesData 함수는 reader를 가져와 reader에서 bytes []를 반환합니다.

  • 모든 것이 잘 작동하지만 getBytesData 함수는 작동하지 않는 방식으로 작동합니다. 내가
  • 내가 F #으로 최적화 할 수있는 방법이 있나요 동적 팽창하는 또는 고정 아이폰에 배열

을 만드는 어떤 방법이 제로 그냥 배열을 만들 바이트 배열을 채워 만들어?

질문의 종류 죄송

,하지만 난 그것의 모든 주스를 짜내 F에 # 새 프로젝트를 시작, 그래서 방법에게 최적에 가장 좋은 방법은 내 경험에

+0

'는 t 시퀀스 표현의 List 식별자)가 필요합니다 기입하십시오. " –

답변

7

GetBytesIDataReader의 메소드는 실제로 코드를 더 기능적인 방식으로 작성하는 옵션을 제공하지 않습니다 (수정하려는 배열이 필요하므로 간단히 배열을 지정해야합니다 ...).

코드의 버전은 완벽합니다. 완전한 기능을 갖추고 있지는 않지만 명령형 부분을 단일 기능으로 유지하고 나머지 프로그램 기능을 유지하는 것이 좋습니다 (좋은 결과입니다).

코드에서 수행 할 수있는 유일한 변경 사항은 reader을 시퀀스 이해력으로 이동하고 (더 현지화되도록) use 키워드를 사용하여 올바르게 폐기되었는지 확인하는 것입니다. 초기화되지 하나 "를 얻을하는 옵션이 없다, 모든 CLR의 배열이 항상 할당에 0으로 초기화 - 제로 초기화 된 배열은 문제가되지 않습니다 사용

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

을 각 라인을 얻으려고 노력했다 이 작업을 수행. 네이티브 .Net 메소드와 상호 작용하는 것은 다소 emparitiviley (따라서 |> 무시)되어야하므로 함수에 캡슐화 된 다음 함수 프로그래밍의 일부로 fn을 사용합니다. 관심이 있다면 F #에서 .NET 메서드 사용과 관련된 질문을했습니다.

또한 나중에 리더를 처분해야합니다.