public static IEnumerable <T> Shuffle <T>(this IEnumerable <T> source, RandomIntBetween rng) { Contract.Requires <ArgumentNullException>(source != null); Contract.Requires <ArgumentNullException>(rng != null); Contract.Ensures(Contract.Result <IEnumerable <T> >() != null); return(ShuffleIterator(source, rng)); }
/// <remarks> /// Adapted from LukeH's answer on StackOverflow. /// http://stackoverflow.com/users/55847/ /// http://stackoverflow.com/a/5807238/343238 /// </remarks> private static IEnumerable <T> ShuffleIterator <T>(IEnumerable <T> source, RandomIntBetween rng) { var buffer = source.ToList(); for (var i = 0; i < buffer.Count; i++) { var j = rng(i, buffer.Count); yield return(buffer[j]); buffer[j] = buffer[i]; } }
private static TestDelegate TestDelegate <T>(IEnumerable <T> source, RandomIntBetween rng) { return(() => Core.Extensions.ForIEnumerable.Shuffle(source, rng)); }