LINQ плохо работает с двумерными массивами, поэтому ваше требование не менять структуру базового массива исключает множество хороших, элегантных решений.
Тем не менее, вы можете использовать алгоритм тасования Фишера-Йейтса для рандомизации вашего массива на месте.
Этот код основан на ответе, на который я ссылался в предыдущем абзаце (кредит достается Nat Pongjardenlarp). Я адаптировал его к вашему 2D-массиву. Поскольку вы не предоставили MCVE, он полностью не проверен.
Dim rnd As New Random()
For n = total_quizquestions - 1 To 0 Step -1
Dim j = rnd.Next(0, n + 1)
' Swap all three components of the question
For component = 0 To 2
Dim temp = Questions(component, n)
Questions(component, n) = Questions(component, j)
Questions(component, j) = temp
Next component
Next n
И, просто для забавы (и потомства), вот обобщенная (и проверенная) версия без "магических чисел", которая перемешивает любой 2D массив:
Private rnd As New Random()
Sub Shuffle2DArray(Of T)(arr As T(,))
For row = arr.GetUpperBound(1) To arr.GetLowerBound(1) Step -1
Dim swapRow = rnd.Next(0, row + 1)
' Swap all columns of the row
For column = arr.GetLowerBound(0) To arr.GetUpperBound(0)
Dim temp = arr(column, row)
arr(column, row) = arr(column, swapRow)
arr(column, swapRow) = temp
Next column
Next row
End Sub
Очевидно, что вы можете поменять местами Get...Bound(0)
и Get...Bound(1)
, чтобы перемещаться вдоль другой оси двумерного массива.