This is just a quick post about random ordering of IEnumerable types using C# extension. For example you have a IEnumerable of type ‘Employee’ object and you want to randomly pick 7 employee objects, how would you do that? This blog post will create a simple extension method for IEnumerable and show how to use it.
Step 1 : Create an extension class for IEnumerable as below :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sample
{
public static class EnumerableExtentions
{
public static IEnumerable<T> Randomize<T>(this IEnumerable<T> source)
{
var range= new Random();
return source.Randomize(range);
}
private static IEnumerable<T> Randomize<T>(this IEnumerable<T> source, Random range)
{
if (source == null) throw new ArgumentNullException("source");
if (range== null) throw new ArgumentNullException("range");
return source.RandomizeAlgorithm(range);
}
private static IEnumerable<T> RandomizeAlgorithm<T>(this IEnumerable<T> source, Random range)
{
var temp = source.ToList();
for (int i = 0; i < temp.Count; i++)
{
int j = range.Next(i, temp.Count);
yield return temp[j];
temp[j] = temp[i];
}
}
}
}
Step 2 : Use it within your main code as below :
//get all employees
var employees = Employee.GetAllEmployee();
//print in sequence
PrintEmployees(employees);
//randomize using extension
var randomEmployees = Employee.GetAllEmployee().Randomize();
//print them again
Console.WriteLine("**************");
PrintEmployees(randomEmployees);
Job Done!
Sample code is available on GitHub
Note : I am using Fisher–Yates shuffle algorithm for randomizing the collection.