2

DataReaderの結果を解析する関数があり、返されるアイテムの数がわからないので、while..doループを使用してリーダーを反復処理したいと思います。結果は特定のタイプのリストになるはずです。

(fun(reader) ->
            [
                while reader.Read() do
                    new CityType(Id=(reader.GetInt32 0), Name=(reader.GetString 1), StateName=(reader.GetString 2))
            ])

これは私が試したものですが、私が受け取る警告は次のとおりです。

This expression should have type 'unit', but has type 'CityType'. Use 'ignore' to discard the result of the expression, or 'let' 
to bind the result to a name.

では、DataReaderを反復処理してリストを作成するための最良の方法は何でしょうか。

4

2 に答える 2

10

リスト内包表記を使用できます。

[
   while reader.Read() do
       let d =  new CityType(Id=(reader.GetInt32 0), Name=(reader.GetString 1), StateName=(reader.GetString 2))
       yield d
]

もう1つの例を次に示します。

/// The squares of the first 10 integers
let squaresOfOneToTen = [ for x in 0..10 -> x*x ]

また

let squaresOfOneToTen = [ for x in 0..10 do yield x*x ]

シーケンスと配列に対しても実行できます。

seq { 
   for i=1 to 9 do 
      for j=1 to 9 do
         yield (i,j,i*j)
}


[| for i=1 to 100 do yield i*i |]

sequence()でサブシーケンスを生成することもできます。これは、 ProjectEuler31yield!を使用した例です。

于 2010-05-24T02:43:56.980 に答える
6

ここで何が起こっているかを説明する追加情報を提供するために、F#でリストを作成する方法は2つあり、どちらの場合も、中かっこで何か[ ... ]を書いています(最初は少し混乱するかもしれません!)

リストリテラルは、いくつかの式(明示的に記述された式の既知の数)があり、これらの式の評価結果を含むリストを作成する場合に使用されます。例えば:

[ 1; 2; 3; ]       // list of constant expressions
[ 1+1; 2+2; 3+3 ]  // creates list [ 2; 4; 6 ]

リスト内包表記は、何かを実行して要素のリストを生成するコードがある場合に使用されます(計算中に要素を生成することによって)。これは、YinZhuが彼の答えで使用しているものです。いくつかの例は次のとおりです。

[ yield 1; ]           // generates singleton list [ 1 ] 
[ yield 1; yield 2; ]  // generates list with two elements
[ for x in 1 .. 10 do  // iterates loop 10 times
    yield x * x ]      // ... generates element during every iteration

高度な機能一度に複数の要素を生成するために
使用することもできます。yield!

[ yield! [ 1; 2 ]      // generates a list containing [ 1; 2; 3; 4 ]
  yield! [ 3; 4 ] ]

これは再帰関数の記述に使用できるため、ループの代わりに再帰を使用してコードを書き直すことができます(これは、状態を維持する必要がある場合に役立ちますが、コードは現在のようにwhile完全に問題ありません!)

let rec loop reader = 
  [ if reader.Read() then
      yield new CityType(Id=(reader.GetInt32 0), Name=(reader.GetString 1), 
                         StateName=(reader.GetString 2))   
      yield! loop reader ]

これはリスト内包表記によく見られるパターンなので、知っておくと便利です:-)。

于 2010-05-24T02:54:27.490 に答える