2011-11-18 2 views
3

Étant donné la chaîne suivante en C#, comment insérer un caractère entre chaque caractère de la chaîne?Insérer des caractères dans une chaîne en C#

Par exemple: "Hello Sunshine" deviendrait "H.e.l.l.o. .S.u.n.s.h.i.n.e"

Quelle est la, moyen le plus rapide le plus efficace de le faire en C#?

Répondre

5

Que diriez-vous:

string result = string.Join(".", someString.AsEnumerable()); 

Ce cache la majeure partie de la complexité, et utilisera un StringBuilder interne.

+1

Je pense que vous manquez le final '.'. – svick

+0

@svick: je le fais - mais là encore les exigences étaient vagues - le texte dit "entre chaque caractère" mais l'exemple montre le point après le dernier caractère – BrokenGlass

5

Si vous voulez un point après chaque caractère, utilisez un StringBuilder:

StringBuilder sb = new StringBuilder(s.Length * 2); 
foreach (char c in s) { 
    sb.Append(c); 
    sb.Append('.'); 
} 
string result = sb.ToString(); 

Si vous ne voulez pas le point de fuite puis dans .NET 4.0, vous pouvez utiliser string.Join.

string result = string.Join(".", (IEnumerable<char>)s); 

Dans .NET 3.5 et plus le second paramètre doit être un tableau, ce qui signifie que vous devrez créer temporairement un tableau il serait probablement plus rapide d'utiliser la solution StringBuilder ci-dessus et de traiter la première ou dernier index comme un cas particulier.

Remarque: Souvent, vous n'avez pas besoin de la solution la plus efficace, mais simplement d'une solution suffisamment rapide. Si une solution légèrement plus lente mais beaucoup plus simple est suffisante pour vos besoins, utilisez-la plutôt que d'optimiser vos performances inutilement.

+5

1 - peut améliorer l'efficacité en faisant 'StringBuilder = new StringBuilder (s.Length * 2); ' –

+0

Bonne idée. Actualisé. –

+1

Pour les problèmes de la même taille que l'exemple, StringBuilder est inutile et lourd. –

1

Vous souciez-vous des performances sur de grandes chaînes?

var result = string.Join(".", str.Select(c => c.ToString()); 
+2

Cela manquerait le '.' final. –

+0

@Kirik, ouais, n'a pas mentionné que – Snowbear

0

La réponse de Mark est probablement plus lisible. Mais j'apprécie toujours ce genre de solution:

string.Join("", "Hello Sunshine".Select(x => x + ".")) 
+0

Puis 'string.Concat'. On est quittes :) – Snowbear

1

Ceci est ma proposition, je sais que cela ne semble pas super sexy, mais je crois qu'il est plus rapide (3 fois plus rapide pour la chaîne de l'échantillon) et nécessite la quantité exacte de mémoire que tous ceux qui utilisent le produit, JOIN, et tout ce que le jazz :-)

static string ConvertString(string s) 
{ 
    char[] newS = new char[s.Length * 2 + 1]; 
    int i = 0; 
    do 
    { 
     newS[i] = s[i/2]; 
     if (i == (s.Length * 2 - 2)) 
      break; 

     i++; 
     newS[i] = '.'; 
     i++; 
    } 
    while (true); 
    return new string(newS); 
} 

de plus, il ne nécessite pas le cadre 4.

Questions connexes