Вы должны использовать стек или очередь. Они оба удаляют элементы по мере их использования.
Private numbers As Integer() = {1, 16, 31, 46, 61, 10, 15, 14, 75, 33, 11, 19, 25, 44, 50, 72, 2, 44, 20, 30}
Private rng As New Random
Private Sub OutputNumbersInRandomOrder()
Dim randomisedNumbers As New Queue(Of Integer)(numbers.OrderBy(Function(n) rng.NextDouble()))
Do Until randomisedNumbers.Count = 0
Dim number = randomisedNumbers.Dequeue()
Console.WriteLine(number)
Loop
End Sub
Каждый раз, когда вы звоните Dequeue
, первый номер удаляется из списка и возвращается. Вы можете делать это сколько угодно раз, создавая новую очередь каждый раз, когда предыдущая пуста, например,
Private numbers As Integer() = {1, 16, 31, 46, 61, 10, 15, 14, 75, 33, 11, 19, 25, 44, 50, 72, 2, 44, 20, 30}
Private randomisedNumbers As Queue(Of Integer)
Private rng As New Random
Private Function GetRandomNumber() As Integer
If randomisedNumbers Is Nothing OrElse randomisedNumbers.Count = 0 Then
randomisedNumbers = New Queue(Of Integer)(numbers.OrderBy(Function(n) rng.NextDouble()))
End If
Return randomisedNumbers.Dequeue()
End Function
Вы можете сделать то же самое с Stack(Of Integer)
и вызовом Pop
. Единственное отличие состоит в том, что стек принимает элементы с другого конца - LIFO вместо FIFO. Поскольку элементы рандомизированы и добавлены в одно и то же время, в результате на самом деле нет никакой разницы, особенно учитывая, что вызов OrderByDescending
в любом случае обратит результаты обоих типов. Для иллюстрации:
Dim numbers = {1, 2, 3, 4, 5}
Dim q1 As New Queue(Of Integer)(numbers)
Dim s1 As New Stack(Of Integer)(numbers)
Console.WriteLine("q1:")
Do Until q1.Count = 0
Console.WriteLine(q1.Dequeue())
Loop
Console.WriteLine("s1:")
Do Until s1.Count = 0
Console.WriteLine(s1.Pop())
Loop
Array.Reverse(numbers)
Dim q2 As New Queue(Of Integer)(numbers)
Dim s2 As New Stack(Of Integer)(numbers)
Console.WriteLine("q2:")
Do Until q2.Count = 0
Console.WriteLine(q2.Dequeue())
Loop
Console.WriteLine("s2:")
Do Until s2.Count = 0
Console.WriteLine(s2.Pop())
Loop
Вывод:
q1:
1
2
3
4
5
s1:
5
4
3
2
1
q2:
5
4
3
2
1
s2:
1
2
3
4
5