Skip to content

Instantly share code, notes, and snippets.

@mtherien
Created June 21, 2018 13:24
Show Gist options
  • Select an option

  • Save mtherien/da47a7e65f594c3f8942c7e15e2e7b08 to your computer and use it in GitHub Desktop.

Select an option

Save mtherien/da47a7e65f594c3f8942c7e15e2e7b08 to your computer and use it in GitHub Desktop.
CachedEnumerator
// Source: https://wilsonhut.wordpress.com/2012/03/15/obvious-extension-methods-ienumerable-cache/
public static class Extensions
{
public static CachedEnumerable<T> Cache<T>(this IEnumerable<T> enumerable)
{
return new CachedEnumerable<T>(enumerable);
}
}
public class CachedEnumerable<T> : IEnumerable<T>
{
IEnumerator<T> _originalEnumerator;
readonly IEnumerable<T> _originalEnumerable;
readonly List<T> _cache = new List<T>();
public CachedEnumerable(IEnumerable<T> enumerable)
{
_originalEnumerable = enumerable;
}
public IEnumerator<T> GetEnumerator()
{
foreach (var t in _cache)
{
yield return t;
}
if (_originalEnumerator == null)
{
_originalEnumerator = _originalEnumerable.GetEnumerator();
}
while (_originalEnumerator.MoveNext())
{
_cache.Add(_originalEnumerator.Current);
yield return _originalEnumerator.Current;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment