It is more efficient to use an algorithm like Fisher-Yates shuffle to reorder the items. The run-time complexity of OrderBy is O(N log N) while Fisher-Yates shuffle is O(N).
Also, to provide random numbers you should use the Random class, not Guid.NewGuid which serves a completely different purpose and just happens to create something that is random (at a higher cost).
I prefer to implement the shuffle as an extension method:
public static class ListExtensions
{
public static IList<T> Shuffle<T>(this IList<T> list, Random random)
{
for (var i = list.Count; i > 1; i -= 1)
{
var j = random.Next(i);
var temp = list[j];
list[j] = list[i - 1];
list[i - 1] = temp;
}
return list;
}
}
You can achieve the desired result by providing a Random instance with a specific seed (in this case 0). This will ensure that the sequence of random numbers generated are the same each time the code executes:
var shuffledList = Enumerable.Range(0, 1000).ToList().Shuffle(new Random(0));