Visualizzazione dei risultati da 1 a 10 su 10

Visualizzazione discussione

  1. #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.

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.