Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 7th, 2012  |  syntax: None  |  size: 1.36 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Is there an equivalent to the F# Seq.windowed in C#?
  2. let windowed windowSize (source: seq<_>) =    
  3.     checkNonNull "source" source
  4.     if windowSize <= 0 then invalidArg "windowSize" (SR.GetString(SR.inputMustBeNonNegative))
  5.     seq { let arr = Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked windowSize
  6.             let r = ref (windowSize-1)
  7.             let i = ref 0
  8.             use e = source.GetEnumerator()
  9.             while e.MoveNext() do
  10.                 arr.[!i] <- e.Current
  11.                 i := (!i + 1) % windowSize
  12.                 if !r = 0 then
  13.                     yield Array.init windowSize (fun j -> arr.[(!i+j) % windowSize])
  14.                 else
  15.                 r := (!r - 1) }
  16.        
  17. public static IEnumerable<T[]> Windowed<T>(this IEnumerable<T> list, int windowSize)
  18. {
  19.     //Checks elided
  20.     var arr = new T[windowSize];
  21.     int r = windowSize - 1, i = 0;
  22.     using(var e = list.GetEnumerator())
  23.     {
  24.         while(e.MoveNext())
  25.         {
  26.             arr[i] = e.Current;
  27.             i = (i + 1) % windowSize;
  28.             if(r == 0)
  29.                 yield return ArrayInit<T>(windowSize, j => arr[(i + j) % windowSize]);
  30.             else
  31.                 r = r - 1;
  32.         }
  33.     }
  34. }
  35. public static T[] ArrayInit<T>(int size, Func<int, T> func)
  36. {
  37.     var output = new T[size];
  38.     for(var i = 0; i < size; i++) output[i] = func(i);
  39.     return output;
  40. }