Cette question n'est pas aussi simple que d'autres affiches l'ont prétendu (et comme je le croyais au départ) - parce que la question n'est pas aussi précise qu'elle le devrait.
Il y a une différence entre «espace» et «espace blanc». Si vous ne parlez que d' espaces, vous devez utiliser une expression régulière de " {2,}"
. Si vous voulez dire des espaces, c'est une autre question. Tous les espaces doivent- ils être convertis en espaces? Que devrait-il arriver à l'espace au début et à la fin?
Pour le benchmark ci-dessous, j'ai supposé que vous ne vous souciez que des espaces et que vous ne voulez rien faire sur des espaces uniques, même au début et à la fin.
Notez que l'exactitude est presque toujours plus importante que les performances. Le fait que la solution Split / Join supprime tout espace blanc de début / fin (même des espaces simples) est incorrect en ce qui concerne vos exigences spécifiées (qui peuvent être incomplètes, bien sûr).
Le benchmark utilise MiniBench .
using System;
using System.Text.RegularExpressions;
using MiniBench;
internal class Program
{
public static void Main(string[] args)
{
int size = int.Parse(args[0]);
int gapBetweenExtraSpaces = int.Parse(args[1]);
char[] chars = new char[size];
for (int i=0; i < size/2; i += 2)
{
// Make sure there actually *is* something to do
chars[i*2] = (i % gapBetweenExtraSpaces == 1) ? ' ' : 'x';
chars[i*2 + 1] = ' ';
}
// Just to make sure we don't have a \0 at the end
// for odd sizes
chars[chars.Length-1] = 'y';
string bigString = new string(chars);
// Assume that one form works :)
string normalized = NormalizeWithSplitAndJoin(bigString);
var suite = new TestSuite<string, string>("Normalize")
.Plus(NormalizeWithSplitAndJoin)
.Plus(NormalizeWithRegex)
.RunTests(bigString, normalized);
suite.Display(ResultColumns.All, suite.FindBest());
}
private static readonly Regex MultipleSpaces =
new Regex(@" {2,}", RegexOptions.Compiled);
static string NormalizeWithRegex(string input)
{
return MultipleSpaces.Replace(input, " ");
}
// Guessing as the post doesn't specify what to use
private static readonly char[] Whitespace =
new char[] { ' ' };
static string NormalizeWithSplitAndJoin(string input)
{
string[] split = input.Split
(Whitespace, StringSplitOptions.RemoveEmptyEntries);
return string.Join(" ", split);
}
}
Quelques essais:
c:\Users\Jon\Test>test 1000 50
============ Normalize ============
NormalizeWithSplitAndJoin 1159091 0:30.258 22.93
NormalizeWithRegex 26378882 0:30.025 1.00
c:\Users\Jon\Test>test 1000 5
============ Normalize ============
NormalizeWithSplitAndJoin 947540 0:30.013 1.07
NormalizeWithRegex 1003862 0:29.610 1.00
c:\Users\Jon\Test>test 1000 1001
============ Normalize ============
NormalizeWithSplitAndJoin 1156299 0:29.898 21.99
NormalizeWithRegex 23243802 0:27.335 1.00
Ici, le premier nombre est le nombre d'itérations, le second est le temps nécessaire et le troisième est un score mis à l'échelle, 1,0 étant le meilleur.
Cela montre que dans au moins certains cas (y compris celui-ci) une expression régulière peut surpasser la solution Split / Join, parfois avec une marge très significative.
Toutefois, si vous passez à une exigence « tous les espaces », puis de Split / Join ne semble gagner. Comme c'est souvent le cas, le diable est dans le détail ...