string.replace: Sai farlo? Oppure inventi la ruota?

Quanto segue -purtroppo- non e’ frutto della mia fantasia. Lo scorso mese stavo effettuando un debug su del codice. Senza entrare nel dettaglio vi contestualizzo a grandi linee il contesto

  • ho del testo in ingresso
  • devo effettuare una serie di sostituzioni
  • torno il valore del testo modificato

Trovi qualche difficolta’? Io no sulla teoria. Poi e’ arrivata la pratica.

string.replace

Qualsiasi persona sana di mente applicherebbe una soluzione stile la seguente:

1
2
string sentence = "hello world! today is a sunny sunday";
var text = sentence.Replace(oldValue, newValue);

sfruttando il Replace presente nel Framework

string.replace “HomeMade”

Si sente spesso parlare di cugini con tantissime G nei gruppi Facebook. Ecco, questo molto probabilmente arriva da uno di loro che sulla carta e’ anche Senior.

Durante il mio debug mi sono trovato davanti qualcosa tipo

1
var finalText = ReplaceText( .... )

A quel punto mi e’ scappato un F11 in debug e sono finito al suo interno.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public string ReplaceText(string originalString, string oldValue, string newValue)
{

    int startIndex = 0;

    if (newValue == null)
    {
        newValue = string.Empty;
    }

    while (true)
    {
        startIndex = originalString
            .IndexOf(oldValue, startIndex);

        if (startIndex == -1)
        {
            break;
        }

        originalString = 
            originalString.Substring(0, startIndex) 
            + newValue 
            + originalString.Substring(startIndex + oldValue.Length);

        startIndex += 
            newValue.Length;
    }

    return originalString;

}

Quando l’ho letto mi volevo cavare gli occhi, ve lo posso giurare! Se anche il vostro istinto e’ quello di cercare un Set di Cacciaviti sappiate che non siete soli.

Ora, in tutta onesta’ non capisco se mi sconvolge di piu’

  • il fatto di avere scritto un qualcosa di presente nel sistema
  • di averlo basato su un while (true)

Oppure il fatto che io l’abbia letto e scritto questo post di conseguenza …