Torna al Thread
Module MainModule
Sub Main()
Dim g As New Generator(3, New Char() {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"})
'Così scrivo tutti i numeri da "000" a "999"
Do While g.ContaSuccessivo = True
Console.WriteLine(g.OttieniCorrente())
Loop
Console.WriteLine(g.OttieniCorrente())
End Sub
End Module
Public Class Generator
''' <summary>
''' La lunghezza della stringa
''' </summary>
''' <remarks></remarks>
Private length As Integer
''' <summary>
''' L'insieme di tutti i caratteri da combinare
''' </summary>
''' <remarks></remarks>
Private charSet() As Char
''' <summary>
''' L'insieme dei caratteri che costituiscono la stringa corrente
''' </summary>
''' <remarks></remarks>
Private current() As Char
''' <summary>
''' Questo indica che indice ha ciascuno dei caratteri di current
''' Aumentando i valori dell'array a partire dal fondo
''' Imposti l'indice di ogni carattere e fai procedere il conteggio
''' </summary>
''' <remarks></remarks>
Private indiceCaratteri As Integer()
''' <summary>
''' Inizializza una nuova istanza della classe
''' </summary>
''' <param name="length">La lunghezza della combinazione dei caratteri</param>
''' <param name="charSet">L'elenco dei caratteri da combinare</param>
''' <remarks></remarks>
Public Sub New(ByVal length As Integer, ByVal charSet As Char())
Me.length = length
Me.charSet = charSet
current = New Char(length - 1) {}
indiceCaratteri = New Integer(length - 1) {}
reset()
End Sub
''' <summary>
''' Imposta indiceCaratteri prima del primo elemento
''' </summary>
''' <remarks></remarks>
Private Sub reset()
For i As Integer = 0 To length - 2
current(i) = charSet(0)
indiceCaratteri(i) = 0
Next
indiceCaratteri(length - 1) = -1
End Sub
''' <summary>
''' Aumenta current di una posizione e restituisce vero se non è stato raggiunto il limite
''' </summary>
''' <returns>Falso se è stata raggiunta l'ultima combinazione, altrimenti vero</returns>
''' <remarks></remarks>
Public Function ContaSuccessivo() As Boolean
'La lunghezza del set di caratteri
Dim charSetLength As Integer = charSet.Length
'Con questo faccio aumentare l'ultimo indice dei caratteri di uno
'Se ha raggiunto il limite aumento il penultimo ecc...
For i As Integer = length - 1 To 0 Step -1
'Aumento di uno l'indice
indiceCaratteri(i) += 1
'Se ha raggiunto il limite
If indiceCaratteri(i) = charSetLength Then
'Lo azzero
indiceCaratteri(i) = 0
'E procedo col carattere successivo rifacendo il controllo
Else
'Altrimenti esco dal ciclo
Exit For
End If
Next
'imposto l'elenco dei caratteri
For i As Integer = 0 To length - 1
current(i) = charSet(indiceCaratteri(i))
Next
'Controllo che non sia stato raggiunta l'ultima combinazione
For i As Integer = length - 1 To 0 Step -1
If indiceCaratteri(i) <> charSetLength - 1 Then
'Se almeno uno è diverso significa che non è l'ultima combinazione
Return True
End If
Next
'Ma se il ciclo finisce significa che
'l'utima combinazione è stata raggiunta
Return False
End Function
''' <summary>
''' Ottiene il valore corrente
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function OttieniCorrente() As String
If (current(length - 1) = Nothing) Then
Throw New InvalidOperationException("Devi prima chiamare almeno una volta il metodo ContaSuccessivo")
End If
Dim result As String = ""
For i As Integer = 0 To length - 1
result = result & current(i)
Next
Return result
End Function
End Class