IEnumerável item da lista aleatória

esta classe IEnumerable para obter um item aleatório de uma lista

Aqui está Enumarator

namespace System.Collections.Generic
{
public class RandomItemEnumerator<TItem> : IEnumerator<TItem>
{
private readonly TItem[] _items;
private readonly Random _random = new Random();
private int _position;
public void Shuffle<T>(T[] array)
{
var random = _random;
for (var i = array.Length; i > 1; i--)
{
var j = random.Next(i);
var tmp = array[j];
array
[j] = array[i - 1];
array
[i - 1] = tmp;
}
}

public RandomItemEnumerator(TItem[] list)
{
_items
= list.Clone() as TItem[];
Reset();
}

#region Implementation of IEnumerator

public bool MoveNext()
{
_position
++;
return _position < _items.Length;
}

public void Reset()
{
Shuffle(_items);
_position
= -1;
}

public TItem Current
{
get
{
try
{
return _items[_position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
object IEnumerator.Current
{
get { return Current; }
}

#endregion

#region Implementation of IDisposable

public void Dispose()
{
GC
.SuppressFinalize(this);
}

#endregion
}
}

Aqui está a coleção de itens aleatórios

namespace System.Collections.Generic
{
public class Randomizer<TItem> : IEnumerable<TItem>
{
#region Implementation of IEnumerable

public TItem[] Items { get; set; }

public Randomizer(IEnumerable items)
{
Items = items as TItem[];
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}

public IEnumerator<TItem> GetEnumerator()
{
return new RandomItemEnumerator<TItem>(Items);
}

#endregion
}
}

E finalmente aqui está o método de extensão

namespace System.Collections.Generic
{
public static class Randomizer
{
public static IEnumerable<TItem> ToRandomized<TItem>(this IEnumerable<TItem> items)
{
return new Randomizer<TItem>(items);
}
}
}

Para refatoração, crie solicitação pull ^^
https://github.com/VictorTomaili/Randomizer