36 people like it.
    Like the snippet!
  
  Take every Nth element of sequence
  A function that takes every Nth element of a sequence where N is passed as an argument. The snippet shows a naive function and a function using IEnumerator directly to provide an efficient implementation.
  
1: 
2: 
3: 
4: 
  | 
  let everyNth n seq = 
    seq |> Seq.mapi (fun i el -> el, i)              // Add index to element
        |> Seq.filter (fun (el, i) -> i % n = n - 1) // Take every nth element
        |> Seq.map fst                               // Drop index from the result
  | 
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
  | 
  let everyNth n (input:seq<_>) = 
    seq { use en = input.GetEnumerator()
          // Call MoveNext at most 'n' times (or return false earlier)
          let rec nextN n = 
            if n = 0 then true
            else en.MoveNext() && (nextN (n - 1)) 
          // While we can move n elements forward...
          while nextN n do
            // Retrun each nth element
            yield en.Current }
  | 
val everyNth : n:int -> seq:seq<'a> -> seq<'a>
Full name: Script.Simple.everyNth
val n : int
Multiple items
val seq : seq<'a>
--------------------
type seq<'T> = System.Collections.Generic.IEnumerable<'T>
Full name: Microsoft.FSharp.Collections.seq<_>
module Seq
from Microsoft.FSharp.Collections
val mapi : mapping:(int -> 'T -> 'U) -> source:seq<'T> -> seq<'U>
Full name: Microsoft.FSharp.Collections.Seq.mapi
val i : int
val el : 'a
val filter : predicate:('T -> bool) -> source:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.filter
val map : mapping:('T -> 'U) -> source:seq<'T> -> seq<'U>
Full name: Microsoft.FSharp.Collections.Seq.map
val fst : tuple:('T1 * 'T2) -> 'T1
Full name: Microsoft.FSharp.Core.Operators.fst
val everyNth : n:int -> input:seq<'a> -> seq<'a>
Full name: Script.Efficient.everyNth
val input : seq<'a>
Multiple items
val seq : sequence:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Core.Operators.seq
--------------------
type seq<'T> = System.Collections.Generic.IEnumerable<'T>
Full name: Microsoft.FSharp.Collections.seq<_>
val en : System.Collections.Generic.IEnumerator<'a>
System.Collections.Generic.IEnumerable.GetEnumerator() : System.Collections.Generic.IEnumerator<'a>
val nextN : (int -> bool)
System.Collections.IEnumerator.MoveNext() : bool
property System.Collections.Generic.IEnumerator.Current: 'a
  
  
  More information