177 votes

Comment remplacer une partie de la chaîne par une position ?

J'ai cette corde : ABCDEFGHIJ

J'ai besoin de remplacer la position 4 par la position 5 avec la chaîne de caractères suivante ZX

Cela ressemblera à ceci : ABCZXFGHIJ

Mais pas à utiliser avec string.replace("DE","ZX") - J'ai besoin d'utiliser avec position

Comment puis-je le faire ?

0 votes

@TotZam - veuillez vérifier les dates. Ce site l'un est plus ancien que celui que vous avez lié.

0 votes

@ToolmakerSteve Je regarde généralement la qualité de la question et des réponses, pas les dates, comme il a été dit de le faire. aquí . Dans ce cas, il semble que j'aie fait une erreur et que j'aie cliqué sur la mauvaise question à marquer comme doublon, puisque la qualité de cette question est manifestement meilleure, et j'ai donc marqué l'autre question.

0 votes

@TotZam - ah, je ne connaissais pas cette recommandation - merci de l'avoir signalée. (Bien qu'il soit déroutant de voir quelque chose de plus ancien signalé comme un doublon de quelque chose de plus récent, donc dans un tel cas, il vaudrait la peine d'expliquer explicitement que vous marquez comme doublon une question PLUS ANCIENNE, parce que celle liée a de meilleures réponses).

229voto

V4Vendetta Points 15354
string s = "ABCDEFGH";
s= s.Remove(3, 2).Insert(3, "ZX");

22 votes

Je préfère cela à l'initialisation d'un nouveau StringBuilder(...). Merci !

3 votes

Je ne sais pas pourquoi quelqu'un utiliserait stringbuilder pour cette opération. Voici une bonne réponse

212voto

Albin Sunnanbo Points 30722

La façon la plus simple d'ajouter et de supprimer des plages dans une chaîne est d'utiliser la fonction StringBuilder .

var theString = "ABCDEFGHIJ";
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "ZX");
theString = aStringBuilder.ToString();

Une alternative est d'utiliser String.Substring mais je pense que le StringBuilder le code devient plus lisible.

6 votes

Il serait préférable d'envelopper cela dans une méthode d'extension :)

2 votes

Pourquoi utilisez-vous un StringBuilder ici ? Consultez la réponse de V4Vendetta, qui est beaucoup plus lisible...

2 votes

@Fortega Remove() et Insert() créent et renvoient chacun une nouvelle chaîne. L'approche StringBuilder évite ce coût supplémentaire en travaillant dans une section de mémoire pré-allouée et en déplaçant les caractères dans celle-ci.

47voto

Nick Miller Points 353

ReplaceAt(int index, int length, string replace)

Voici une méthode d'extension qui n'utilise ni StringBuilder ni Substring. Cette méthode permet également à la chaîne de remplacement de dépasser la longueur de la chaîne source.

//// str - the source string
//// index- the start location to replace at (0-based)
//// length - the number of characters to be removed before inserting
//// replace - the string that is replacing characters
public static string ReplaceAt(this string str, int index, int length, string replace)
{
    return str.Remove(index, Math.Min(length, str.Length - index))
            .Insert(index, replace);
}

Lorsque vous utilisez cette fonction, si vous souhaitez que l'ensemble de la chaîne de remplacement remplace autant de caractères que possible, définissez la longueur sur la longueur de la chaîne de remplacement :

"0123456789".ReplaceAt(7, 5, "Hello") = "0123456Hello"

Sinon, vous pouvez spécifier la quantité de caractères qui seront supprimés :

"0123456789".ReplaceAt(2, 2, "Hello") = "01Hello456789"

Si vous spécifiez que la longueur est de 0, cette fonction agit comme la fonction d'insertion :

"0123456789".ReplaceAt(4, 0, "Hello") = "0123Hello456789"

Je suppose que c'est plus efficace puisque la classe StringBuilder ne doit pas être initialisée et qu'elle utilise des opérations plus basiques. Veuillez me corriger si je me trompe :)

5 votes

Stringbuilder est plus efficace si la chaîne est plus longue que, disons, 200 caractères.

0 votes

Pas de stress. J'ai travaillé directement. Merci

9voto

Daniel Mošmondor Points 10926

Utilisez String.Substring() (détails aquí ) pour couper la partie gauche, puis votre remplacement, puis la partie droite. Jouez avec les index jusqu'à ce que vous y arriviez :)

Quelque chose comme :

string replacement=original.Substring(0,start)+
    rep+original.Substring(start+rep.Length);

2 votes

J'ai créé trois méthodes en utilisant les trois méthodes ci-dessus (string.Remove/Insert, Stringbuilder.Remove/Insert et la réponse Substring de Daniel, et SubString était la méthode la plus rapide.

7voto

alykhalid Points 887

Comme méthode d'extension.

public static class StringBuilderExtension
{
    public static string SubsituteString(this string OriginalStr, int index, int length, string SubsituteStr)
    {
        return new StringBuilder(OriginalStr).Remove(index, length).Insert(index, SubsituteStr).ToString();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X