(Я думаю), мне нужно было то же самое, но я не мог найти то, что мне нужно, среди ответов (в основном потому, что они были на незнакомых языках, я думаю).
Я пришел с этим (сама функция):
Public Function nChooseK(Of T)(ByVal Values As List(Of T), ByVal k As Integer, Optional ByRef Result As List(Of List(Of T)) = Nothing, Optional ByRef CurCombination As List(Of T) = Nothing, Optional ByVal Offset As Integer = 0) As List(Of List(Of T))
Dim n = Values.Count
If CurCombination Is Nothing Then CurCombination = New List(Of T)
If Result Is Nothing Then Result = New List(Of List(Of T))
If k <= 0 Then
Result.Add(CurCombination.ToArray.ToList)
Return Result
Else
For i = Offset To n - k
CurCombination.Add(Values(i))
nChooseK(Values, k - 1, Result, CurCombination, i + 1)
CurCombination.RemoveAt(CurCombination.Count - 1)
Next
Return Result
End If
End Function
Все, что нужно сделать, это положить его в модуле (или чуть выше/ниже суб/функции, которая называет это я думаю) и вызов это с какой-либо переменной и числа
Как назвать:
nChooseK(List, kInteger)
Небольшой пример:
Dim NumbersCombinations As List(Of List(Of Integer)) = nChooseK(lstNumbers, k)
Полный пример для использования с Целыми и струнными инструментами наряду с печатью результата на экран:
Dim Numbers() As Integer = {1, 2, 3, 4, 5}
Dim lstNumbers = New List(Of Integer)
Dim k = 3
lstNumbers.AddRange(Numbers)
Dim NumbersCombinations As List(Of List(Of Integer)) = nChooseK(lstNumbers, k)
Dim sbCombinations1 As New StringBuilder
For i = 0 To NumbersCombinations.Count - 1
sbCombinations1.AppendLine()
For j = 0 To NumbersCombinations(i).Count - 1
sbCombinations1.Append(NumbersCombinations(i)(j) & " ")
Next
sbCombinations1.Length = sbCombinations1.Length - 1
Next
MsgBox(sbCombinations1.ToString)
Dim lstNoumera = New List(Of String)
lstNoumera.AddRange({"ena", "dio", "tria", "tessera", "pente"})
Dim Combinations As List(Of List(Of String)) = nChooseK(lstNoumera, k)
Dim sbCombinations2 As New StringBuilder
For i = 0 To Combinations.Count - 1
sbCombinations2.AppendLine()
For j = 0 To Combinations(i).Count - 1
sbCombinations2.Append(Combinations(i)(j) & " ")
Next
sbCombinations2.Length = sbCombinations2.Length - 1
Next
MsgBox(sbCombinations2.ToString)
Я нашел это для PHP и собираюсь, чтобы увидеть, если я могу преобразовать его в VB.net - HTTP: // stackoverflow.com/questions/8567082/how-to-generate-in-php-all-combinations-of-items-in-multiple-arrays –