Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [VB.NET] inserire virgola in una stringa

    Ciao a tutti,

    Ho bisogno di creare una funzione che sia in grado di inserire in una stringa, dopo ogni lettera, una virgola.

    Per esempio ho una stringa che contiene "CIAO". Ho bisogna che questa stringa diventi
    "C,I,A,O".


    Secondo voi come posso fare?


    Grazie a tutti!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Utilizza il metodo String.Insert
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Sposto nel forum "Visual Basic e .NET Framework".

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    la prima cosa che mi è venuta in mente

    Dim a As String = "CIAO"
    Dim b As String = ""
    For i As Integer = 1 To a.Length
    b = b + a.Substring(i - 1, 1) + ","
    Next
    b = b.TrimEnd(","c)

    forse esistono altri metodi più efficienti

  5. #5
    Quote Originariamente inviata da antonygm Visualizza il messaggio
    Ciao a tutti,

    Ho bisogno di creare una funzione che sia in grado di inserire in una stringa, dopo ogni lettera, una virgola.

    Per esempio ho una stringa che contiene "CIAO". Ho bisogna che questa stringa diventi
    "C,I,A,O".


    Secondo voi come posso fare?


    Grazie a tutti!
    Ciao, puoi provare anche così

    codice:
    MessageBox.Show([String].Join(",", "CIAO".ToCharArray().AsEnumerable))

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    se guardiamo le prestazioni la funzione di sotto è molto veloce
    codice:
        Private Function ModificaStringa1(stringaIniziale As String) As String
            Dim sb As New StringBuilder(100)
            For i As Integer = 0 To stringaIniziale.Length - 1
                sb.Append(stringaIniziale.Chars(i))
                sb.Append(","c)
            Next
            If sb.Length > 0 Then sb.Remove(sb.Length - 1, 1)
            Return sb.ToString
        End Function

    mentre quella suggerita da sspintux, anche se più lenta, mi pare molto interessante
    codice:
        Private Function ModificaStringa3(stringaIniziale As String) As String
            Return String.Join(",", stringaIniziale.ToArray().AsEnumerable)
        End Function

    il codice di sotto è il più lento (con una stringa di 26 caratteri in un ciclo molto lungo)
    codice:
        Private Function ModificaStringa2(stringaIniziale As String) As String
            Dim sb As String = ""
            For i As Integer = 0 To stringaIniziale.Length - 1
                sb &= stringaIniziale.Chars(i) & ","c
            Next
            If sb.Length > 0 Then sb.Remove(sb.Length - 1, 1)
            Return sb
        End Function
    Pietro

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ho testato le prestazioni ma per semplicità potrebbe essere utile scrivere

    codice:
            For i = s.Length - 1 To 1 Step -1
                s = s.Insert(i, ",")
            Next i
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Non ho testato le prestazioni ma per semplicità potrebbe essere utile scrivere

    codice:
            For i = s.Length - 1 To 1 Step -1
                s = s.Insert(i, ",")
            Next i
    Solo per togliermi la ruggine accumulata in questi giorni, dalle prove che sto facendo, questo metodo è il più lento per una stringa di qualche decina di caratteri, mentre è il più veloce per una stringa di pochi caratteri.

    ps. è chiaro che sto calcolando i tempi in un ciclo di un milione di passi e che perciò una soluzione vale l'altra. L'importante secondo me è vedere più soluzioni per imparare a manipolare bene le stringhe.
    Pietro

  9. #9
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Non ho testato le prestazioni ma per semplicità potrebbe essere utile scrivere

    codice:
            For i = s.Length - 1 To 1 Step -1
                s = s.Insert(i, ",")
            Next i
    Questa soluzione ha l'innegabile pregio della semplicità (cosa che in questo caso può convenire privilegiare), ma sapendo cosa accade "sotto il cofano", è abbastanza chiaro che è O(n^2) quando potrebbe essere O(n) (forse anche qualcosa di peggio, dato che le stringhe .NET sono immutabili e ogni modifica equivale ad allocare una nuova stringa).

    In genere per manipolazioni di questo genere l'approccio più rapido è basato su StringBuilder (che corrisponde di fatto ad un buffer di caratteri "stile C"):
    codice:
        Private Function AddCommas(str As String) As String
            If str.Length=0 Then Return str
            Dim sb As New StringBuilder
            sb.Length=str.Length*2
            For i As Integer = 0 To str.Length - 1
                sb(i*2)=str(i)
                sb(i*2+1)=","c
            Next
            sb.Length-=1
            Return sb.ToString()
        End Function
    Credo anch'io che la soluzione in stile programmazione funzionale di sspintux sia la più elegante, ed è sostanzialmente è equivalente a quello che in Python scriverei come
    codice:
    def AddCommas(s):
        return ",".join(s)
    (in effetti, visto che sparisce il 90% della verbosità non starei nemmeno a metterlo in una funzione a parte).

    Da notare che nessuno degli approcci qui citati tiene in considerazione i surrogate pairs; qualunque stringa UTF-16 contenente codepoints superiori a 0xD7FF passata a queste funzioni verrebbe sfasciata senza pietà.

    Per sistemare questo problema, un approccio potrebbe essere:
    codice:
        Private Function AddCommas(str As String) As String
            If str.Length = 0 Then Return str
            Dim sb As New StringBuilder(str.Length*2)
            For i As Integer = 0 To str.Length - 1
                sb.Append(str(i))
                If Not char.IsHighSurrogate(str(i)) Then 
                    sb.Append(","c)
                End If
            Next
            sb.Length-=1
            Return sb.ToString()
        End Function
    Ultima modifica di MItaly; 04-01-2014 a 11:16
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.