Llamo a una API REST y recibo una respuesta XML. Devuelve una lista de nombres de espacios de trabajo, y estoy escribiendo un IsExistingWorkspace()
método rápido . Dado que todos los espacios de trabajo consisten en caracteres contiguos sin espacios en blanco, supongo que la forma más fácil de averiguar si un espacio de trabajo en particular está en la lista es eliminar todos los espacios en blanco (incluidas las nuevas líneas) y hacer esto (XML es la cadena recibida de la web solicitud):
XML.Contains("<name>" + workspaceName + "</name>");
Sé que distingue entre mayúsculas y minúsculas, y estoy confiando en eso. Solo necesito una forma de eliminar todos los espacios en blanco de una cadena de manera eficiente. Sé que RegEx y LINQ pueden hacerlo, pero estoy abierto a otras ideas. Principalmente solo me preocupa la velocidad.
fuente
Respuestas:
Esta es la forma más rápida que conozco, a pesar de que dijiste que no querías usar expresiones regulares:
fuente
Regex.Replace(XML, @"\s+", "")
?private static readonly Regex sWhitespace = new Regex(@"\s+"); public static string ReplaceWhitespace(string input, string replacement) { return sWhitespace.Replace(input, replacement); }
\s
significa "hacer coincidir cualquier token de espacio en blanco" y+
significa "hacer coincidir uno o más de los tokens en curso". También RegExr es un buen sitio web para practicar escribir expresiones RegEx, si quieres experimentar.Tengo una forma alternativa sin regexp, y parece funcionar bastante bien. Es una continuación de la respuesta de Brandon Moretz:
Lo probé en una prueba unitaria simple:
Para 1,000,000 de intentos, la primera opción (sin regexp) se ejecuta en menos de un segundo (700 ms en mi máquina), y la segunda toma 3.5 segundos.
fuente
.ToCharArray()
no es necesario; puedes usar.Where()
directamente en una cadena.ToCharArray
es más rápido que usar.Where()
directamente en la cadena. Esto tiene algo que ver con la sobrecargaIEnumerable<>
en cada paso de iteración, y alToCharArray
ser muy eficiente (copia en bloque) y el compilador optimiza la iteración sobre las matrices. Por qué existe esta diferencia, nadie ha podido explicarme, pero mide antes de eliminarToCharArray()
.Pruebe el método de reemplazo de la cadena en C #.
fuente
Mi solución es usar Split and Join y es sorprendentemente rápido, de hecho, la respuesta más rápida aquí.
Tiempos para 10,000 bucles en una cadena simple con espacios en blanco con nuevas líneas y pestañas
Mejore esto envolviéndolo en un método para darle significado, y también conviértalo en un método de extensión mientras estamos en ello ...
fuente
string[]
ychar[]
? sólo hay que especificar cuál de ellos desea por ejemplo:string.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));
. En realidad, eso es lo que hace su llamadadefault
en este caso, ya que también regresanull
: ayuda al compilador a decidir qué sobrecarga elegir. De ahí mi comentario porque la afirmación en su comentario "Split necesita una matriz válida y nulo no funcionará ..." es falsa. No es gran cosa, solo pensé que valía la pena mencionarlo ya que Jake Drew preguntó cómo funcionaba. +1 por su respuestastring.Concat("H \ne llo Wor ld".Split())
Sobre la base de la respuesta de Henks , he creado algunos métodos de prueba con su respuesta y algunos métodos más optimizados. Encontré que los resultados difieren según el tamaño de la cadena de entrada. Por lo tanto, he probado con dos conjuntos de resultados. En el método más rápido, la fuente vinculada tiene una forma aún más rápida. Pero, dado que se caracteriza por ser inseguro, he dejado esto fuera.
Resultados de cadena de entrada largos:
Resultados cortos de la cadena de entrada:
Código :
Pruebas :
Editar : Probé un buen revestimiento de Kernowcode.
fuente
Solo una alternativa porque se ve bastante bien :) - NOTA: La respuesta de Henks es la más rápida de todas.
Probar 1,000,000 bucles en
"This is a simple Test"
Este método = 1.74 segundos
Regex = 2.58 segundos
new String
(Henks) = 0.82fuente
Encontré un buen artículo sobre esto en CodeProject por Felipe Machado (con la ayuda de Richard Robertson )
Probó diez métodos diferentes. Esta es la versión insegura más rápida ...
Y la versión segura más rápida ...
También hay algunos buenos puntos de referencia independientes en Stack Overflow de Stian Standahl que también muestran cómo la función de Felipe es aproximadamente un 300% más rápida que la siguiente función más rápida.
fuente
Si necesita un rendimiento excelente, debe evitar LINQ y expresiones regulares en este caso. Hice algunas evaluaciones comparativas de rendimiento, y parece que si desea eliminar el espacio en blanco desde el principio y el final de la cadena, string.Trim () es su función final.
Si necesita quitar todos los espacios en blanco de una cadena, el siguiente método funciona más rápido de todo lo que se ha publicado aquí:
fuente
Regex es exagerado; solo usa la extensión en la cadena (gracias Henk). Esto es trivial y debería haber sido parte del marco. De todos modos, aquí está mi implementación:
fuente
System.Linq
Aquí hay una alternativa lineal simple a la solución RegEx. No estoy seguro de cuál es más rápido; tendrías que compararlo.
fuente
Necesitaba reemplazar el espacio en blanco en una cadena con espacios, pero no espacios duplicados. por ejemplo, necesitaba convertir algo como lo siguiente:
a
Utilicé el siguiente método
fuente
Supongo que su respuesta XML se ve así:
La mejor manera de procesar XML es usar un analizador XML, como LINQ to XML :
fuente
Aquí hay otra variante:
Al igual que con la mayoría de las otras soluciones, no he realizado pruebas exhaustivas de referencia, pero esto funciona lo suficientemente bien para mis propósitos.
fuente
Nosotros podemos usar:
fuente
null
.He encontrado diferentes resultados para ser verdad. Estoy tratando de reemplazar todo el espacio en blanco con un solo espacio y la expresión regular fue extremadamente lenta.
Lo que funcionó de manera más óptima para mí (en C ++ cli) fue:
Intenté la rutina anterior primero reemplazando cada carácter por separado, pero tuve que cambiar a hacer subcadenas para las secciones que no son espaciales. Cuando se aplica a una cadena de 1,200,000 caracteres:
fuente