Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- namespace SkipWhilePerf
- {
- public static class Program
- {
- private static readonly Stopwatch s_watch = new Stopwatch();
- static void Start() { s_watch.Restart(); }
- static void Stop() { s_watch.Stop(); Console.WriteLine(s_watch.Elapsed); }
- static void Restart() { Stop(); Start(); }
- public static void Main()
- {
- int[] array = Enumerable.Range(1, 1000000).ToArray();
- // old
- Start();
- foreach (var foo in array.OldSkipWhile(i => i < 500000));
- Restart();
- foreach (var foo in array.OldSkipWhile((i, index) => i < 500000 && index < 500000));
- // new
- Restart();
- foreach (var bar in array.NewSkipWhile(i => i < 500000));
- Restart();
- foreach (var bar in array.NewSkipWhile((i, index) => i < 500000 && index < 500000));
- Stop();
- }
- public static IEnumerable<T> OldSkipWhile<T>(this IEnumerable<T> src, Func<T, bool> func)
- {
- bool yielding = false;
- foreach (T element in src)
- {
- if (!yielding && !func(element)) yielding = true;
- if (yielding) yield return element;
- }
- }
- public static IEnumerable<T> OldSkipWhile<T>(this IEnumerable<T> src, Func<T, int, bool> func)
- {
- int index = -1;
- bool yielding = false;
- foreach (T element in src)
- {
- checked { index++; }
- if (!yielding && !func(element, index)) yielding = true;
- if (yielding) yield return element;
- }
- }
- public static IEnumerable<T> NewSkipWhile<T>(this IEnumerable<T> src, Func<T, bool> func)
- {
- using (IEnumerator<T> e = src.GetEnumerator())
- {
- do
- if (!e.MoveNext()) yield break;
- while (func(e.Current));
- do
- yield return e.Current;
- while (e.MoveNext());
- }
- }
- public static IEnumerable<T> NewSkipWhile<T>(this IEnumerable<T> src, Func<T, int, bool> func)
- {
- int index = -1;
- using (IEnumerator<T> e = src.GetEnumerator())
- {
- do
- {
- if (!e.MoveNext()) yield break;
- checked { index++; }
- } while (func(e.Current, index));
- do
- yield return e.Current;
- while (e.MoveNext());
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement