Jam*_*ack 2 f# functional-programming datareader
我有一个函数将解析DataReader的结果,我不知道返回了多少项,所以我想使用while..do循环迭代读取器,结果应该是某个类型的列表.
(fun(reader) ->
[
while reader.Read() do
new CityType(Id=(reader.GetInt32 0), Name=(reader.GetString 1), StateName=(reader.GetString 2))
])
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的,但我收到的警告是:
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.
Run Code Online (Sandbox Code Playgroud)
那么迭代DataReader并创建列表的最佳方法是什么?
你可以使用列表理解:
[
while reader.Read() do
let d = new CityType(Id=(reader.GetInt32 0), Name=(reader.GetString 1), StateName=(reader.GetString 2))
yield d
]
Run Code Online (Sandbox Code Playgroud)
这是另一个例子:
/// The squares of the first 10 integers
let squaresOfOneToTen = [ for x in 0..10 -> x*x ]
Run Code Online (Sandbox Code Playgroud)
要么
let squaresOfOneToTen = [ for x in 0..10 do yield x*x ]
Run Code Online (Sandbox Code Playgroud)
您也可以为序列和数组执行此操作:
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 |]
Run Code Online (Sandbox Code Playgroud)
你也可以在sequence(yield!)中产生一个子序列,这是一个使用Project Euler 31的例子.
只是提供一些可以解释这里发生了什么的其他信息 - 有两种方法可以在F#中创建列表,在这两种情况下,你用方括号写一些东西[ ... ](起初可能有点令人困惑!)
当您有一些表达式(已知数量的显式编写表达式)并且想要创建包含评估这些表达式的结果的列表时,将使用列表文字.例如:
[ 1; 2; 3; ] // list of constant expressions
[ 1+1; 2+2; 3+3 ] // creates list [ 2; 4; 6 ]
Run Code Online (Sandbox Code Playgroud)
列表理解当你有一些代码,不会的东西,(在计算过程中通过生产要素)生成的元素列表中使用.这是尹朱在答案中使用的内容.一些例子是:
[ 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
Run Code Online (Sandbox Code Playgroud)
高级功能
您还可以使用yield!一次生成多个元素:
[ yield! [ 1; 2 ] // generates a list containing [ 1; 2; 3; 4 ]
yield! [ 3; 4 ] ]
Run Code Online (Sandbox Code Playgroud)
这可用于编写递归函数,因此您可以使用递归而不是循环来重写代码(如果您需要保留某些状态,这将非常有用,但正如您的代码目前看起来一样,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 ]
Run Code Online (Sandbox Code Playgroud)
这是一种经常出现在列表推导中的模式,因此了解它很有用:-).