Chaîne n'a pas ReplaceAt()
, et je suis un peu en chute libre sur la façon de créer une fonction décente qui fait ce dont j'ai besoin. Je suppose que le coût du processeur est élevé, mais la taille des chaînes est petite, donc tout va bien
Réponses
Trop de publicités?Le plus simple approche serait quelque chose comme:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
char[] chars = input.ToCharArray();
chars[index] = newChar;
return new string(chars);
}
C'est maintenant une méthode d'extension de sorte que vous pouvez utiliser:
var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo
Il serait agréable de penser d'une certaine manière qui ne demandait qu'une seule copie des données plutôt que de les deux ici, mais je ne suis pas sûr de toute façon de le faire. Il est possible que cela devrait le faire:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
StringBuilder builder = new StringBuilder(input);
builder[index] = newChar;
return builder.ToString();
}
... Je pense qu'elle dépend entièrement de la version du framework que vous utilisez.
J'ai soudainement eu besoin de faire cette tâche et trouvé ce sujet. Donc, voici ma variante de style linq:
public static class Extensions
{
public static string ReplaceAt(this string value, int index, char newchar)
{
if (value.Length <= index)
return value;
else
return string.Concat(value.Select((c, i) => i == index ? newchar : c));
}
}
et ensuite, par exemple:
string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');
Finalement, je devais utiliser .Net Framework 2, alors j’utilise une variante de classe StringBuilder
.
Les chaînes sont des objets immuables, vous ne pouvez donc pas remplacer un caractère donné dans la chaîne. Ce que vous pouvez faire, c'est créer une nouvelle chaîne en remplaçant le caractère donné.
Mais si vous voulez créer une nouvelle chaîne, pourquoi ne pas utiliser StringBuilder:
string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();
//newS = "axc";