2011-02-07 15 views
16

Acabo de enfrentar este problema hoy y me pregunto si alguien tiene alguna idea sobre por qué esta prueba puede fallar (dependiendo de la cultura). El objetivo es comprobar si el texto de prueba contiene dos espacios uno al lado del otro, lo que hace de acuerdo con string.IndexOf (incluso si le digo a la cadena que reemplace todas las ocurrencias de dos espacios uno al lado del otro). Después de algunas pruebas, parece que \xAD está causando este problema.cadena IndexOf y reemplazar

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

no estoy seguro de si esto va a ser su problema, pero si usted tiene 3 espacios al lado del otro en esta prueba, entonces usted va a terminar con 2 uno al lado del otro al final de la misma. –

+0

La prueba tiene éxito para mí. ¿Estás seguro de que el código que publicaste es el mismo que el código que estabas probando? –

+0

El problema es que 'IndexOf' utiliza una búsqueda específica de la cultura, mientras que 'Reemplazar' utiliza una búsqueda ordinal. @Chris: el punto es que debería fallar. –

Respuesta

16

Sí, he encontrado lo mismo antes (aunque con diferentes caracteres). Básicamente, IndexOf tendrá en cuenta varios aspectos de los caracteres Unicode "especiales" al encontrar coincidencias, mientras que Replace solo trata las cadenas como una secuencia de puntos de código.

Desde el IndexOf docs:

Este método realiza una palabra (mayúsculas y minúsculas y la cultura y minúsculas) búsqueda usando la cultura actual. La búsqueda comienza en la primera posición del personaje de esta instancia y continúa hasta la última posición del personaje.

... y desde Replace:

Este método realiza un ordinal (mayúsculas y minúsculas y la cultura y minúsculas) de búsqueda para encontrar oldValue.

Usted podría utilizar la sobrecarga de IndexOf que toma un StringComparison, y obligarlo a realizar una comparación ordinal sin embargo.

+0

Después de registrar el reflector encontré que usa StringComparison.CurrentCulture de forma predeterminada. Ya debería haber aprendido a evitar los valores predeterminados en los parámetros. Gracias Jon. – ZFE

+0

[La documentación para String.IndexOf en .Net Micro Framework] (http://msdn.microsoft.com/en-us/library/hh400536.aspx) también establece que la búsqueda es "sensible a las mayúsculas y minúsculas y cultura- sensible". Pero lamentablemente no hay 'System.StringComparison' en netmf, ni String.IndexOf que pueda aceptarlos. – dumbledad