2011-02-08 14 views
5

Tengo el siguiente método donde necesito verificar algunas cadenas determinadas que podrían ser en cualquier caso y luego eliminarlas. Solo me preguntaba si había una mejor manera de realizar?Por curiosidad: ¿hay un enfoque mejor para hacer este reemplazo de cuerdas?

private void MyMethod(string Filter) 
{ 
    //need to remove <Filter> and </Filter> case in-sensitive 
    var result = Filter.ToLower().Replace("<filter>",""); 
    result = Filter.ToLower().Replace("</filter>,""); 

    ........................... 
} 
+1

'Regex.Replace (Filter," ", string.empty, RegexOptions.IgnoreCase); 'Si está interesado en la ejecución de varios métodos, hay muchas discusiones al respecto aquí en SO. –

+3

no va a cambiar el caso de lo que está entre las etiquetas. o no te importa –

+3

'ToUpper' es una mejor opción que' ToLower'. La comparación de cadenas y el reemplazo se han optimizado para la primera. Desde la perspectiva del desarrollador, no hay diferencia, así que es una solución simple. –

Respuesta

3

Un problema con este enfoque es que convertirá toda la cadena en minúsculas, no solo hará que las mayúsculas y minúsculas se vuelvan insensibles.

Se puede utilizar una expresión regular para hacer un caso partido insensetive:

string result = Regex.Replace(
    Filter, 
    "</?filter>", 
    String.Empty, 
    RegexOptions.IgnoreCase 
); 

Otra alternativa es utilizar el método IndexOf para localizar las cuerdas, ya que puede hacer una búsqueda que insensetive:

string result = Filter; 
int index; 
while ((index = IndexOf("<filter>", StringComparison.OrdinalIgnoreCase)) != -1) { 
    result = result.Remove(index, 8); 
} 
while ((index = IndexOf("</filter>", StringComparison.OrdinalIgnoreCase)) != -1) { 
    result = result.Remove(index, 9); 
} 
1

Replace llamadas a código no administrado que está implementado en C++ que me imagino que será difícil de superar.

Sin embargo, puedo ver que sigue usando .ToLower() que puede cortar a una llamada y mantener la cadena.

+0

Creo que las cosas ToLower() podrían ser un problema. Además, la cadena de salida ahora está en minúscula. –

+0

Sí, estaba escribiendo las palabras :) – Aliostad

+0

Lo dudo mucho (bit de código no administrado). –

4

Comprobar esta respuesta: Is there an alternative to string.Replace that is case-insensitive?

Es posible que desee hacer una comparación con un control del funcionamiento. Perfile esto con un perfilador. Es la única forma de saber realmente, qué es más rápido.

Pero, sinceramente, ¿el rendimiento realmente importa? ¿Con qué frecuencia estás haciendo esto? No puedo verte haciendo esto tan a menudo, ese rendimiento se convertirá en un problema ...

Puedes probar Regex.Replace, con una sustitución insensible a mayúsculas y minúsculas. Esto no es mas rapido Pero es insensible a mayúsculas y minúsculas.

+0

¿Por qué crees que una expresión regular va a ser más rápida? Y si no, ¿por qué recomiendas intentarlo? –

+0

No creo que haya afirmado que 'Regex.Replace' es más rápido, sino todo lo contrario. –

+0

No, no creo que Regex.Replace sea más rápido. Pero hace un reemplazo insensible a mayúsculas y minúsculas. Actualizaré mi respuesta. –

1

En cualquier caso, está colocando aquí la cadena original, lo que podría no ser una buena cosa.

+0

Los comentarios en el código indican que la intención es realizar un reemplazo insensible a mayúsculas y minúsculas. Supongo que es por eso que la cuerda se está convirtiendo en minúsculas. –

+1

@Cody Gray: eso es cierto, pero el problema aquí es que la parte de la cadena que no se reemplaza también se convierte en minúsculas. Creo que eso es preocupación bjornars aquí. (incluso si esto es más un comentario que una respuesta en realidad) –

0

Si el código proporcionado trabaja para usted, que esto será más rápido:

private void MyMethod(string Filter) 
{ 
    //need to remove <Filter> and </Filter> case in-sensitive 
    var result = Filter.ToLower().Replace("</filter>",""); 

    ........................... 
} 

como resultado de la primera instrucción se ignora.

+0

Falta una comilla doble de cierre. Además, esto no produce el mismo resultado. Simplemente elimina uno de los pasos. Esencialmente, su código no está haciendo lo que dice el comentario anterior. – David

+0

Es cierto, pero ESTÁ haciendo lo mismo que el código proporcionado, pero más rápido, ya que ambas sustituciones se realizan en 'Filter.ToLower()'. – Excel20

+0

Me está costando no subir de categoría esto. No debería y no lo haré. Pero me hiciste sonreír :) –

1

Depende de algunas cosas, cuánto tiempo la cadena de filtro es, etc.
Así que tendrá que medir.

Pero yo esperaría que un (único) RegEx sea más rápido aquí.

+0

¿Qué sucede si tiene 50 cadenas para reemplazar aquí por alguna razón? ¿No será increíble el RegEx? –

+0

@Oyvind: Sería muy rápido, cuanto más, mejor. –

+0

No me refería a la velocidad, sino a la legibilidad del código. ¿Hay alguna manera de hacer que se vea remotamente bien? (Ahora no me regEx, es por eso que estoy preguntando;)) –

Cuestiones relacionadas