Bjørn-Roger Kringsjå 在this great answer 中将一些 C++ 代码转换为 VB,为此做了繁重的工作。
原始作品用于置换字符串字符。我修改它以使用字符串(我一直想做的事情)并允许您指定分隔符。您可以只返回 List(Of String()) 或类似名称,然后在调用代码中使用 String.Join。
Public NotInheritable Class Permutation
Public Shared Function Create(array As String(), sep As String) As List(Of String)
Return Permutation.Create(array, False, sep)
End Function
Public Shared Function Create(array As String(), sort As Boolean,
sep As String) As List(Of String)
If (array Is Nothing) Then
Throw New ArgumentNullException("array")
ElseIf ((array.Length < 0) OrElse (array.Length > 13)) Then
Throw New ArgumentOutOfRangeException("array")
End If
Dim list As New List(Of String)
Dim n As Integer = array.Length
Permutation.Permute(list, array, 0, array.Length, sep)
If (sort) Then
list.Sort()
End If
Return list
End Function
Private Shared Sub Permute(list As List(Of String), array As String(),
start As Int32, ndx As Int32, sep As String)
Permutation.Print(list, array, ndx, sep)
If (start < ndx) Then
Dim i, j As Integer
For i = (ndx - 2) To start Step -1
For j = (i + 1) To (ndx - 1)
Permutation.Swap(array, i, j)
Permutation.Permute(list, array, (i + 1), ndx, sep)
Next
Permutation.RotateLeft(array, i, ndx)
Next
End If
End Sub
Private Shared Sub Print(list As List(Of String), array As String(),
size As Int32, sep As String)
Dim tmp As New List(Of String)
If (array.Length <> 0) Then
For i As Integer = 0 To (size - 1)
tmp.Add(array(i))
Next
list.Add(String.Join(sep, tmp))
End If
End Sub
Private Shared Sub Swap(array As String(), i As Int32, j As Int32)
Dim tmp As String
tmp = array(i)
array(i) = array(j)
array(j) = tmp
End Sub
Private Shared Sub RotateLeft(array As String(), start As Int32, n As Int32)
Dim tmp As String = array(start)
For i As Integer = start To (n - 2)
array(i) = array(i + 1)
Next
array(n - 1) = tmp
End Sub
End Class
注意:我的模组将与 Kringsjå 先生的原始代码作为重载共存。用法:
Dim data = {"red", "blue", "white"}
Dim combos = Permutation.Create(data, ", ")
结果:
红、蓝、白
红、白、蓝
蓝色、红色、白色
蓝色、白色、红色
白色、红色、蓝色
白、蓝、红