Pregunta Por curiosidad, ¿hay un enfoque mejor para hacer este reemplazo de cuerdas?


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?

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>,"");

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

5
2018-02-08 12:19


origen


Respuestas:


Un problema con ese enfoque es que convertirá toda la cadena en minúsculas, no solo hará que una caja se vuelva insensible.

Puedes usar una expresión regular para hacer una coincidencia que no distinga mayúsculas y minúsculas:

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

Otra alternativa es usar el IndexOf método para localizar las cadenas, ya que puede hacer una búsqueda insensible de mayúsculas y minúsculas:

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);
}

3
2018-02-08 12:28



Verifique esta respuesta: ¿Hay alguna alternativa a la cadena? ¿Reemplazar que no distingue entre mayúsculas y minúsculas?

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

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

Tu podrías intentar Regex.Replace, con un caso insensible al reemplazar. Esto no es mas rapido Pero es un caso insensible.


4
2018-02-08 12:24



Replace llama al código no administrado que se implementa en C ++ que imagino que será difícil de superar.

Sin embargo, puedo verte seguir usando .ToLower() cuál puedes cortar a una llamada y guardar la secuencia.


1
2018-02-08 12:24



En cualquier caso, usted está colocando aquí su cadena original, lo que podría no ser algo bueno.


1
2018-02-08 12:25



Depende de algunas cosas, la longitud de la cadena de filtro, etc.
Así que tendrás que medir.

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


1
2018-02-08 12:31



Si el código provisto funciona para ti, entonces 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 el resultado de la primera declaración se ignora.


0
2018-02-08 12:27



Preguntas populares