right left lastindexofany index example ejemplos array c# string indexof

left - lastindexofany c# example



C#string.IndexOf() devuelve un valor inesperado (3)

Esta pregunta se aplica a los dispositivos C #, .NET Compact Framework 2 y Windows CE 5.

Encontré un error en una .net DLL que estaba en uso en dispositivos CE muy diferentes durante años, sin mostrar ningún problema. De repente, en un nuevo dispositivo Windows CE 5.0, este error apareció en el siguiente código:

string s = "Print revenue receipt"; // has only single space chars int i = s.IndexOf(" "); // two space chars

Espero que sea -1, sin embargo, esto solo fue cierto hasta hoy, cuando indexOf devolvió de repente 5.

Dado que este comportamiento no ocurre cuando se usa

int i = s.IndexOf(" ", StringComparison.Ordinal);

Estoy bastante seguro de que este es un fenómeno basado en la cultura, pero no puedo reconocer la diferencia que hace este nuevo dispositivo. Es una versión casi idéntica de un dispositivo conocido (solo una CPU más rápida y una nueva placa).

Ambos dispositivos:

  • ejecuta Windows CE 5.0 con la misma localización
  • Informes de System.Environment.Version ''2.0.7045.0''
  • CultureInfo.CurrentUICulture and CultureInfo.CurrentCulture report ''en-GB'' (también probado con ''de-DE'')
  • ''todas'' las claves de registro relacionadas son iguales.

El nuevo dispositivo tenía el CF 3.5 preinstalado, cuyos archivos GAC a los que renombré experimentalmente, sin ningún cambio en el comportamiento descrito. Dado que en tiempo de ejecución siempre se informa la versión 2.0.7045.0, asumo que estos ensamblajes no tienen efecto.

Aunque esto no es difícil de arreglar, no puedo soportarlo cuando las cosas parecen tan mágicas. ¿Alguna pista de lo que me faltaba?

Edición: se está volviendo extraño y extraño, vea la captura de pantalla:

Uno mas:


Creo que ya tienes la respuesta usando una búsqueda ordinal.

int i = s.IndexOf(" ", StringComparison.Ordinal);

Puede leer una pequeña sección en la documentación de la Clase de cadena que dice esto sobre el tema:

Los métodos de búsqueda de cadenas, como String.StartsWith y String.IndexOf, también pueden realizar comparaciones de cadenas ordinales o sensibles a la cultura. El siguiente ejemplo ilustra las diferencias entre comparaciones ordinales y sensibles a la cultura usando el método IndexOf. Una búsqueda sensible a la cultura en la que la cultura actual es el inglés (Estados Unidos) considera que la subcadena "oe" coincide con la ligadura "œ". Debido a que un guión suave (U + 00AD) es un carácter de ancho cero, la búsqueda trata al guión suave como equivalente a Vaciar y encuentra una coincidencia al principio de la cadena. Una búsqueda ordinal, por otro lado, no encuentra una coincidencia en ninguno de los casos.


La cultura puede parecer realmente mágica en algunos sistemas. Lo que vine a hacer siempre después de años de dolor es establecer la información de la cultura manualmente en InvariantCulture donde no quiero explícitamente un comportamiento diferente para las diferentes culturas. Por lo tanto, mi sugerencia sería: Hacer que el control de IndexOf use siempre la misma información de cultura, así:

int i = s.IndexOf(" ", StringComparison.InvariantCulture);


La referencia en http://msdn.microsoft.com/en-us/library/k8b1470s.aspx indica:

"Los conjuntos de caracteres incluyen caracteres ignorables, que son caracteres que no se consideran al realizar una comparación lingüística o cultural. En una búsqueda sensible a la cultura, si el valor contiene un carácter ignorable, el resultado es equivalente a buscar con ese carácter eliminado".

Esto es de la referencia 4.5, las referencias de versiones anteriores no contienen nada de eso.

Así que permítanme adivinar: han cambiado las reglas de 4.0 a 4.5 y ahora el segundo espacio de una secuencia de dos espacios se considera un "carácter ignorable", al menos si el motor reconoce su cadena como texto en inglés (como en su cadena de ejemplo s), de lo contrario no.

Y de alguna manera en su nuevo dispositivo, se usa un archivo 4.5 dll en lugar del esperado 2.0 dll.

Una suposición salvaje, lo sé :)