J'ai cette chaîne: ABCDEFGHIJ
J'ai besoin de remplacer de la position 4 à la position 5 avec la chaîne ZX
Il ressemblera à ceci: ABCZXFGHIJ
Mais ne pas utiliser avec string.replace("DE","ZX")
- je dois utiliser avec position
Comment puis-je le faire?
Réponses:
Le moyen le plus simple d'ajouter et de supprimer des plages dans une chaîne consiste à utiliser le
StringBuilder
.Une alternative est d'utiliser
String.Substring
, mais je pense que leStringBuilder
code devient plus lisible.la source
la source
ReplaceAt (index int, longueur int, remplacement de chaîne)
Voici une méthode d'extension qui n'utilise ni StringBuilder ni Substring. Cette méthode permet également à la chaîne de remplacement de s'étendre au-delà de la longueur de la chaîne source.
Lorsque vous utilisez cette fonction, si vous voulez que la chaîne de remplacement entière remplace autant de caractères que possible, définissez la longueur sur la longueur de la chaîne de remplacement:
Sinon, vous pouvez spécifier le nombre de caractères qui seront supprimés:
Si vous spécifiez la longueur à 0, alors cette fonction agit exactement comme la fonction d'insertion:
Je suppose que c'est plus efficace car la classe StringBuilder n'a pas besoin d'être initialisée et qu'elle utilise des opérations plus basiques. S'il vous plait corrigez moi si je me trompe. :)
la source
Utilisez
String.Substring()
(détails ici ) pour couper la partie gauche, puis votre pièce de remplacement, puis la partie droite. Jouez avec les index jusqu'à ce que vous ayez raison :)Quelque chose comme:
la source
En tant que méthode d'extension.
la source
la source
t
place.Si vous vous souciez des performances, ce que vous voulez éviter ici, ce sont les allocations. Et si vous êtes sur .Net Core 2.1+ (ou le, encore inédit, .Net Standard 2.1), alors vous pouvez, en utilisant la
string.Create
méthode :Cette approche est plus difficile à comprendre que les alternatives, mais c'est la seule qui n'allouera qu'un seul objet par appel: la chaîne nouvellement créée.
la source
Vous pouvez essayer quelque chose de lien ceci:
la source
Comme d'autres l'ont mentionné, la
Substring()
fonction est là pour une raison:J'ai également chronométré cela par rapport à la
StringBuilder
solution et j'ai obtenu 900 tics contre 875. C'est donc un peu plus lent.la source
"ABCDEFGHIJ"
et"ZX"
sont de longueurs différentes.Encore un autre
la source
Avec l'aide de cet article, je crée la fonction suivante avec des contrôles de longueur supplémentaires
la source
Toutes les autres réponses ne fonctionnent pas si la chaîne contient un caractère Unicode (comme Emojis) car un caractère Unicode pèse plus d'octets qu'un caractère.
Avec cette rubrique , j'étends la classe StringInfo à Replace by position en conservant l'algorithme de Nick Miller pour éviter cela:
la source
Je cherchais une solution avec les exigences suivantes:
Solution 1
La solution qui me convient le mieux est la suivante:
Cela utilise
StringBuilder.Replace(oldChar, newChar, position, count)
Solution 2
L'autre solution qui satisfait mes exigences est d'utiliser
Substring
avec la concaténation:C'est bien aussi. Je suppose que ce n'est pas aussi efficace que le premier en termes de performances (en raison d'une concaténation de chaînes inutile). Mais l' optimisation prématurée est la racine de tout mal .
Alors choisissez celui que vous aimez le plus :)
la source
Il est préférable d'utiliser le
String.substr()
.Comme ça:
la source
Laissez-moi vous expliquer ma solution.
Étant donné le problème de la modification d'une chaîne dans ses deux positions spécifiques («position 4 à position 5») avec deux caractères 'Z' et 'X' et la demande est d'utiliser l'index de position pour modifier la chaîne et non la chaîne Remplacer ( ) (peut-être en raison de la possibilité de répétition de certains caractères dans la chaîne réelle), je préférerais utiliser une approche minimaliste pour atteindre l'objectif par rapport à l'utilisation d'une
Substring()
chaîneConcat()
ou d'une chaîneRemove()
et d'uneInsert()
approche. Bien que toutes ces solutions serviront l'objectif pour atteindre le même objectif, mais cela dépend juste du choix personnel et de la philosophie de régler avec une approche minimaliste.Pour en revenir à ma solution mentionnée ci-dessus, si nous examinons de plus près
string
etStringBuilder
, tous deux traitent en interne une chaîne donnée comme un tableau de caractères. Si nous regardons son implémentation,StringBuilder
il maintient une variable interne quelque chose comme «internal char[] m_ChunkChars;
» pour capturer la chaîne donnée. Maintenant qu'il s'agit d'une variable interne, nous ne pouvons pas y accéder directement. Pour le monde externe, pour pouvoir accéder et modifier ce tableau de caractères, lesStringBuilder
expose via la propriété d'indexeur qui ressemble à quelque chose comme ci-dessousMa solution mentionnée ci-dessus tire parti de cette capacité d'indexation pour modifier directement le tableau de caractères maintenu en interne, ce que l'OMI est efficace et minimaliste.
BTW; nous pouvons réécrire la solution ci-dessus de manière plus élaborée, comme ci-dessous
Dans ce contexte, je voudrais également mentionner que dans ce cas,
string
il a également la propriété d'indexeur comme moyen d'exposer son tableau de caractères interne, mais dans ce cas, il n'a que la propriété Getter (et pas de Setter) car la chaîne est de nature immuable. Et c'est pourquoi nous devons utiliserStringBuilder
pour modifier le tableau de caractères.Et last but not least, cette solution convient uniquement à ce problème spécifique où la demande est de ne remplacer que quelques caractères par un index de position connu à l'avance. Ce n'est peut-être pas la meilleure solution lorsque l'exigence est de modifier une chaîne assez longue, c'est-à-dire que le nombre de caractères à modifier est grand.
la source
la source
Voici une méthode d'extension simple:
Utilisez-le comme ceci:
la source
Je pense que le moyen le plus simple serait le suivant: (sans stringbuilder)
Cela fonctionne car une variable de type string peut être traitée comme un tableau de variables char. Vous pouvez, par exemple, faire référence au deuxième caractère d'une variable de chaîne avec le nom "myString" comme myString [1]
la source
string
les caractères à remplacer n'apparaissent qu'une seule fois. Si vous exécutez ceci contre, disons,"DBCDEFGHIE"
alors vous obtenez"ZBCZXFGHIX"
, ce qui n'est pas le résultat souhaité. De plus, je ne suis pas d'accord pour dire que c'est plus simple que les autres non-StringBuilder
solutions qui ont été affichées il y a deux ans et demi.