2011-02-07 19 views
16

Ho appena affrontato questo problema oggi e mi chiedo se qualcuno ha qualche idea sul perché questo test potrebbe fallire (a seconda della cultura). Lo scopo è quello di verificare se il testo del test contiene due spazi uno accanto all'altro, il che corrisponde a string.IndexOf (anche se dico alla stringa di sostituire tutte le occorrenze di due spazi uno accanto all'altro). Dopo alcuni test sembra che \xAD causi questo problema in qualche modo.stringa IndexOf e Sostituisci

public class ReplaceIndexOfSymmetryTest 
{ 
    [Test] 
    public void IndexOfShouldNotFindReplacedString() 
    { 
     string testText = "\x61\x20\xAD\x20\x62"; 
     const string TWO_SPACES = " "; 
     const string ONE_SPACE = " "; 
     string result = testText.Replace(TWO_SPACES, ONE_SPACE); 
     Assert.IsTrue(result.IndexOf(TWO_SPACES) < 0); 
    } 
} 
+0

non sono sicuro se questo sta andando essere il problema, ma se si dispone di 3 posti l'uno accanto all'altro in questo test, allora si finirà con 2 accanto all'altro, alla fine di esso. –

+0

Il test ha successo per me. Sei sicuro che il codice che hai postato sia lo stesso del codice che stavi testando? –

+0

Il problema è 'IndexOf' usa la ricerca specifica della cultura mentre' Replace' usa una ricerca ordinale. @Chris: il punto è che dovrebbe fallire. –

risposta

16

Sì, ho incontrato la stessa cosa prima (anche se con caratteri diversi). Fondamentalmente, IndexOf prenderà in considerazione vari aspetti dei caratteri Unicode "speciali" quando si trovano le corrispondenze, mentre Replace considera le stringhe come una sequenza di punti di codice.

Dal IndexOf docs:

Questo metodo esegue una parola (e sensibile cultura-case-sensitive) ricerca utilizzando la cultura corrente. La ricerca inizia dalla prima posizione del carattere di questa istanza e continua fino all'ultima posizione del carattere.

... e da Replace:

Questo metodo esegue un numero ordinale (cultura-insensitive maiuscole e minuscole e) ricerca per trovare oldValue.

Si potrebbe utilizzare il sovraccarico di IndexOf che prende un StringComparison, e costringerlo a eseguire un confronto ordinale però.

+0

Dopo aver controllato in riflettore ho scoperto che utilizza StringComparison.CurrentCulture per impostazione predefinita. Avrei dovuto già imparare a evitare le impostazioni predefinite nei parametri. Grazie Jon. – ZFE

+0

[La documentazione per String.IndexOf in .Net Framework Micro] (http://msdn.microsoft.com/en-us/library/hh400536.aspx) afferma inoltre che la ricerca è "sia case-sensitive e culture- sensibile". Ma purtroppo non c'è 'System.StringComparison' in netmf, né String.IndexOf che potrebbe accettarli. – dumbledad