At times you may need to process elements of an array, a collection, or a dictionary object in random order, for example when sampling a population or (more often) when writing a game, such as a card game. Here’s a class that you can use in a For Each statement to randomly process all the elements of any data structure that implements the IEnumerable interface:
Class RandomIterator Implements IEnumerable ' a low-overhead ArrayList to store references Dim items As New ArrayList() Sub New(ByVal collection As IEnumerable, ByVal seed As Integer) ' load all the items in the ArrayList, but in random order Dim rand As New Random(seed) Dim o As Object For Each o In collection Items.Insert(Rand.Next(0, Items.Count + 1), o) Next End Sub Public Function GetEnumerator() As System.Collections.IEnumerator _ Implements System.Collections.IEnumerable.GetEnumerator ' return the enumerator of the inner ArrayList Return items.GetEnumerator() End FunctionEnd Class
This code shows how you can use the RandomIterator class to randomly process all the elements in a string array, but you can use it with collection and dictionaries alike:
Dim arr() As String = {"one", "two", "three", "four", "five" }Dim s As String' the sequence you obtain depends on the seed you pass as the 2nd argumentFor Each s In New RandomIterator(arr, 1234) Console.WriteLine(s)Next
This code produces the following sequence:
threefivetwofourone