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
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5