Collections.shuffle() эквивалентно в vb.net?

Что эквивалентно для java.util.Collections.shuffle() метод для vb.net? Я не нашел ничего похожего на MSDN. Помощь очень ценится.

1 ответ

Решение

Насколько я могу судить, встроенной функции.NET нет, но общий эквивалент легко написать с помощью Linq:

Function Shuffle(Of T)(collection As IEnumerable(Of T)) As List(Of T)
    Dim r As Random = New Random()
    Shuffle = collection.OrderBy(Function(a) r.Next()).ToList()
End Function

Вызов этой функции назначает случайное значение каждому элементу во входном списке, а затем сортирует по этому случайному числу, возвращая новый (перемешанный) список.

Если коллекция является массивом или происходит от IListболее эффективный подход может заключаться в использовании алгоритма Фишера-Йейтса для перетасовки списка на месте:

Sub Shuffle(Of T)(list As IList(Of T))
    Dim r As Random = New Random()
    For i = 0 To list.Count - 1
        Dim index As Integer = r.Next(i, list.Count)
        If i <> index Then
            ' swap list(i) and list(index)
            Dim temp As T = list(i)
            list(i) = list(index)
            list(index) = temp
        End If
    Next
End Sub
Другие вопросы по тегам