12
aBunch=1000とします
オフセット=0とします

getItオフセット=
  MyIEnumerable
  |> Seq.skipaBunch*オフセット
  |> Seq.take aBunch
  |> Seq.iter(..いくつかの処理...)

異なるオフセットでgetIt()を呼び出すと、最終的に「無効な操作」例外が発生し、「入力シーケンスの要素が不十分である」という追加情報が表示されます。

オンラインドキュメントFSharpCollectionsによると、Seq.SkipとSeq.takeの両方で例外が生成されないため、その理由を理解しようとしています。

バージョン:(Visual Studio 2010)ベータ1

4

5 に答える 5

27

これは古い質問であることは知っていますが、誰かが私が行った方法で検索してこれに出くわした場合:

最大n 個の項目が必要な場合は、 Seq.truncateを使用できます。利用可能なアイテムがn未満の場合、例外はスローされません。

于 2010-03-05T01:16:54.653 に答える
7

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 }
于 2009-08-08T02:46:51.907 に答える
3

組み込み関数を使用した、少し短い「skipSafe」実装を次に示します。

module Seq =
    let skipSafe num = 
        Seq.zip (Seq.initInfinite id)
        >> Seq.skipWhile (fun (i, _) -> i < num)
        >> Seq.map snd

または、現在のパイプラインに直接インライン化するだけの場合は、置き換えます

|> Seq.skip num

|> Seq.zip (Seq.initInfinite id)
|> Seq.skipWhile (fun (i, _) -> i < num)
|> Seq.map snd
于 2016-03-01T21:27:17.453 に答える
1
module Seq = 
    let trySkip count source  =
        source |> Seq.indexed |> Seq.filter(fst >> (<=) count) |> Seq.map snd
于 2016-04-12T10:23:44.757 に答える