let aBunch = 1000 let offset = 0 let getIt offset = MyIEnumerable |> Seq.skip aBunch * offset |> Seq.take aBunch |> Seq.iter ( .. some processing ...)
使用不同的偏移量调用getIt()最终会给我一个"无效操作"异常,其中包含"输入序列元素不足"的附加信息
我尝试理解为什么,因为Seq.Skip和Seq.take都没有根据在线文档FSharp Collections生成异常
版本:(Visual Studio 2010)Beta 1
如果使用大于序列的值调用,Seq.skip和Seq.take都将抛出此异常.您可以在Seq.fs中查看源代码以了解原因:
let skip count (sequence: seq<_>) =
{ use e = sequence.GetEnumerator()
let latest = ref (Unchecked.defaultof<_>)
let ok = ref false
for i in 1 .. count do
if not (e.MoveNext()) then
raise <| System.InvalidOperationException "the input sequence had insufficient elements"
while e.MoveNext() do
yield e.Current }
let take count (sequence : seq<'T>) =
if count < 0 then invalidArg "count" "the number of elements to take may not be negative"
(* Note: don't create or dispose any IEnumerable if n = 0 *)
if count = 0 then empty else
{ use e = sequence.GetEnumerator()
for i in 0 .. count - 1 do
if not (e.MoveNext()) then
raise <| System.InvalidOperationException "the input sequence had insufficient elements"
yield e.Current }
Run Code Online (Sandbox Code Playgroud)