Maciej Los
Как я уже упоминал ранее (решение было удалено, поскольку оно было - по вашему мнению - не связано с вопросом), результат, который вы хотите получить, не является перестановка[^].
Если вы заинтересованы в реализации метода, который производит набор последовательностей,
Основываясь на ссылке, предоставленной в решении № 1 компанией OriginalGriff[^], я перевел Linq C# GetPermutations
метод в VB.NET форма:
Sub Main
Dim chars As String = "ABCD"
Dim count = 10
'get 10 permutations of ABCD arranged into 3-part sequences
Dim result = GetPermutations(chars.ToArray(), 3).Take(count)
For Each r In result
Console.WriteLine("{0}", String.Join("", r))
Next
End Sub
Function GetPermutations(Of T)(list AS IEnumerable(Of T), length As Integer) AS IEnumerable(Of IEnumerable(Of T))
If length = 1 Then Return list.Select(Function(o) New T(){o})
Return GetPermutations(list, length - 1) _
.SelectMany(Function(a) list.Where(Function(e) Not a.Contains(e)), Function(t1, t2) t1.Concat(New T(){t2}))
End Function
Приведенный выше код дает 10 результатов, например:
ABC
ABD
ACB
ACD
ADB
ADC
BAC
BAD
BCA
BCD
В случае, если вы хотите получить результат N-части, вам нужно улучшить приведенный выше код:
For i = 1 To chars.Length
Dim result = GetPermutations(chars.ToArray(), i).Take(count)
For Each r In result
Console.WriteLine("{0}", String.Join("", r))
Next
Next
Если вы хотите получить не-Linq решение, вы должны реализовать свое собственное
Swap
и
GetPer
методы, предлагаемые так.