2012-01-08 16 views
8

Ho un programma in cui un utente inserisce una lista di numeri sotto forma di stringa. Questo elenco di numeri è sempre un multiplo di 8.Come dividere una stringa per x quantità di caratteri

Quindi l'elenco può contenere 8, 16, 32, 40, 48, numeri ecc.

Ho bisogno di dividere quella stringa in ogni 8 caratteri.

Ad esempio, dire l'utente ha immesso "1234123445674567"

Come posso dividerlo in una matrice di stringhe in cui (0) è "12341234" e (1) è "45.674.567"

Nota: la dimensione della matrice deve essere uguale alla lunghezza della stringa diviso 8.

Così:

Dim stringArray(txtInput.Text.Length/8) as String 

Edi t: So che potrei farlo creando un loop che conta 8 numeri e lo divide in un array ma che sarebbe lungo e prendere alcune variabili e so che c'è un modo più efficiente per farlo. Io non conosco la sintassi.

risposta

4

Questo dovrebbe dividere la stringa in un array di stringhe di 8 caratteri

Dim orig = "12344321678900987" 
Dim res = Enumerable.Range(0,orig.Length\8).[Select](Function(i) orig.Substring(i*8,8)) 
+4

A proposito, VB è abbastanza intelligente da non aver bisogno di '[Seleziona]'. – Ryan

+0

@minitech Non ho idea della sintassi VB - Ho tradotto questa query automaticamente da C# :) – dasblinkenlight

+3

Sì, nessuno vuole scrivere più VB :) Le parole chiave in VB che seguono un '.' non hanno bisogno di essere scappato con' [ ] 'è tutto. Quindi potresti renderlo un po 'più ordinato con '.Seleziona' invece. – Ryan

4

Si potrebbe utilizzare un ciclo For e Substring:

Dim strings As New List(Of String) 

For i As Integer = 0 To Me.txtInput.Text.Length - 1 Step 8 
    strings.Add(Me.txtInput.Text.Substring(i, 8)) 
Next 

per convertire l'elenco strings a un array (se si ha realmente bisogno di uno) è possibile utilizzare strings.ToArray().


Inoltre, è possibile utilizzare le espressioni regolari e LINQ per una fantasia one-liner:

Text.RegularExpressions.Regex.Matches(Me.txtInput.Text, ".{8}").Select(Function(x) x.Value) 
+0

Mi piace la risposta più degli altri ragazzi. Soprattutto la one-liner sembra molto efficiente. Ci sono cose extra che devo aggiungere o importare nel mio programma per farlo funzionare? Vado a testarlo e se funziona accetterò la tua risposta –

+1

@MarkKramer: No, non dovrebbe esserci. Il one-liner ha bisogno di LINQ, che è disponibile solo in .NET 3.5 e versioni successive (VB 2008 o versioni successive), ma il primo funziona praticamente in tutto. – Ryan

+0

LINQ è qualcosa che l'utente deve installare sul proprio computer? O semplicemente qualcosa di cui ho bisogno sul mio che viene fornito con Visual Studio per compilare il codice –

0
Function slice(ByVal s as String) As String() 
    Return (From c As String in s).ToArray() 
End Function 
+2

Non sono sicuro che questa sia una soluzione alla domanda. Dov'è passata la lunghezza della fetta? –

0

Per espandere la risposta accettata, questa dividerà una stringa in parti anche se la stringa non è divisibile dal divisore

Public Function SplitInParts(s As String, partLength As Integer) As IEnumerable(Of String) 
     If String.IsNullOrEmpty(s) Then 
      Throw New ArgumentNullException("String cannot be null or empty.") 
     End If 
     If partLength <= 0 Then 
      Throw New ArgumentException("Split length has to be positive.") 
     End If 
     Return Enumerable.Range(0, Math.Ceiling(s.Length/partLength)).Select(Function(i) s.Substring(i * partLength, If(s.Length - (i * partLength) >= partLength, partLength, Math.Abs(s.Length - (i * partLength))))) 
    End Function 
Problemi correlati