J'appelle une API REST et je reçois une réponse XML. Il renvoie une liste de noms d'espace de travail et j'écris une IsExistingWorkspace()
méthode rapide . Étant donné que tous les espaces de travail sont constitués de caractères contigus sans espace blanc, je suppose que le moyen le plus simple de savoir si un espace de travail particulier est dans la liste est de supprimer tous les espaces (y compris les nouvelles lignes) et de le faire (XML est la chaîne reçue du Web demande):
XML.Contains("<name>" + workspaceName + "</name>");
Je sais que c'est sensible à la casse, et je compte sur cela. J'ai juste besoin d'un moyen de supprimer efficacement tous les espaces d'une chaîne. Je sais que RegEx et LINQ peuvent le faire, mais je suis ouvert à d'autres idées. Je suis surtout préoccupé par la vitesse.
la source
Réponses:
C'est le moyen le plus rapide que je connaisse, même si vous avez dit que vous ne vouliez pas utiliser d'expressions régulières:
la source
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
signifie "correspondre à n'importe quel jeton d'espace blanc" et+
signifie "correspondre à un ou plusieurs jetons de procédure". Aussi RegExr est un site agréable à pratiquer l' écriture d' expressions avec RegEx, si vous voulez expérimenter.J'ai un moyen alternatif sans regexp, et il semble fonctionner assez bien. C'est une suite à la réponse de Brandon Moretz:
Je l'ai testé dans un test unitaire simple:
Pour 1 000 000 de tentatives, la première option (sans regexp) s'exécute en moins d'une seconde (700 ms sur ma machine) et la seconde prend 3,5 secondes.
la source
.ToCharArray()
n'est pas nécessaire; vous pouvez utiliser.Where()
directement sur une chaîne.ToCharArray
est plus rapide que l'utilisation.Where()
directe sur la chaîne. Cela a quelque chose à voir avec la surcharge dansIEnumerable<>
chaque étape d'itération, etToCharArray
étant très efficace (copie de bloc) et le compilateur optimise l'itération sur les tableaux. Pourquoi cette différence existe, personne n'a pu m'expliquer, mais mesurez avant de vous retirerToCharArray()
.Essayez la méthode de remplacement de la chaîne en C #.
la source
Ma solution consiste à utiliser Split and Join et c'est étonnamment rapide, en fait la plus rapide des meilleures réponses ici.
Timings pour 10 000 boucles sur une chaîne simple avec des espaces incluant de nouvelles lignes et tabulations
Améliorez cela en l'enveloppant dans une méthode pour lui donner un sens, et faites-en également une méthode d'extension pendant que nous y sommes ...
la source
string[]
etchar[]
? il vous suffit de préciser celui que vous voulez par exemple:string.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));
. C'est en fait ce que fait votre appeldefault
dans ce cas car il revientnull
également: il aide le compilateur à décider quelle surcharge choisir. D'où mon commentaire car la déclaration dans votre commentaire "Split a besoin d'un tableau valide et null ne fera pas ..." est fausse. Pas grave, je pensais juste qu'il fallait le mentionner puisque Jake Drew avait demandé comment cela fonctionnait. +1 pour votre réponsestring.Concat("H \ne llo Wor ld".Split())
S'appuyant sur la réponse de Henks j'ai créé quelques méthodes de test avec sa réponse et quelques méthodes ajoutées, plus optimisées. J'ai trouvé que les résultats diffèrent en fonction de la taille de la chaîne d'entrée. Par conséquent, j'ai testé avec deux jeux de résultats. Dans la méthode la plus rapide, la source liée a un moyen encore plus rapide. Mais, comme il est caractérisé comme dangereux, je l'ai laissé de côté.
Résultats de la chaîne d'entrée longue:
Résultats de chaîne d'entrée courts:
Code :
Tests :
Edit : testé une belle doublure de Kernowcode.
la source
Juste une alternative car elle a l'air plutôt sympa :) - NOTE: La réponse de Henks est la plus rapide de celles-ci.
Test de 1 000 000 de boucles sur
"This is a simple Test"
Cette méthode = 1,74 secondes
Regex = 2,58 secondes
new String
(Henks) = 0,82la source
J'ai trouvé un bon article à ce sujet sur CodeProject de Felipe Machado (avec l'aide de Richard Robertson )
Il a testé dix méthodes différentes. Celui-ci est la version dangereuse la plus rapide ...
Et la version sûre la plus rapide ...
Il existe également de jolis repères indépendants sur Stack Overflow de Stian Standahl qui montrent également que la fonction de Felipe est environ 300% plus rapide que la fonction la plus rapide suivante.
la source
Si vous avez besoin de performances exceptionnelles, vous devez éviter LINQ et les expressions régulières dans ce cas. J'ai fait un benchmarking des performances, et il semble que si vous voulez supprimer les espaces blancs du début et de la fin de la chaîne, string.Trim () est votre fonction ultime.
Si vous devez supprimer tous les espaces blancs d'une chaîne, la méthode suivante fonctionne le plus rapidement de tout ce qui a été publié ici:
la source
Regex est exagéré; utilisez simplement l'extension sur la chaîne (merci Henk). C'est trivial et aurait dû faire partie du cadre. Quoi qu'il en soit, voici ma mise en œuvre:
la source
System.Linq
Voici une alternative linéaire simple à la solution RegEx. Je ne sais pas lequel est le plus rapide; il faudrait le comparer.
la source
J'avais besoin de remplacer les espaces blancs dans une chaîne par des espaces, mais pas des espaces en double. par exemple, j'avais besoin de convertir quelque chose comme ceci:
à
J'ai utilisé la méthode suivante
la source
Je suppose que votre réponse XML ressemble à ceci:
La meilleure façon de traiter XML est d'utiliser un analyseur XML, tel que LINQ to XML :
la source
Voici encore une autre variante:
Comme avec la plupart des autres solutions, je n'ai pas effectué de tests de référence exhaustifs, mais cela fonctionne assez bien pour mes besoins.
la source
On peut utiliser:
la source
null
.J'ai trouvé que différents résultats étaient vrais. J'essaie de remplacer tous les espaces par un seul espace et l'expression régulière était extrêmement lente.
Ce qui a fonctionné le mieux pour moi (en C ++ cli) était:
J'ai d'abord essayé la routine ci-dessus en remplaçant chaque caractère séparément, mais j'ai dû passer à la création de sous-chaînes pour les sections non spatiales. Lors de l'application à une chaîne de 1 200 000 caractères:
la source