Comment remplacer une partie de chaîne par position?

J’ai cette chaîne: ABCDEFGHIJ

J’ai besoin de remplacer de la position 4 à la position 5 avec la chaîne ZX

Cela ressemblera à ceci: ABCZXFGHIJ

Mais ne pas utiliser avec ssortingng.replace("DE","ZX") – Je dois utiliser avec la position

Comment puis-je le faire?

La méthode la plus simple pour append et supprimer des plages dans une chaîne consiste à utiliser SsortingngBuilder .

 var theSsortingng = "ABCDEFGHIJ"; var aSsortingngBuilder = new SsortingngBuilder(theSsortingng); aSsortingngBuilder.Remove(3, 2); aSsortingngBuilder.Insert(3, "ZX"); theSsortingng = aSsortingngBuilder.ToSsortingng(); 

Une alternative consiste à utiliser Ssortingng.Subssortingng , mais je pense que le code SsortingngBuilder devient plus lisible.

 ssortingng s = "ABCDEFGH"; s= s.Remove(3, 2).Insert(3, "ZX"); 

ReplaceAt (int index, int length, chaîne à remplacer)

Voici une méthode d’extension qui n’utilise pas SsortingngBuilder ou Subssortingng. Cette méthode permet également à la chaîne de remplacement de dépasser la longueur de la chaîne source.

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

Lorsque vous utilisez cette fonction, si vous souhaitez que la chaîne de remplacement complète 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 à supprimer:

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

Si vous spécifiez la longueur à 0, cette fonction agit comme la fonction d’insertion:

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

Je suppose que cela est plus efficace car la classe SsortingngBuilder n’a pas besoin d’être initialisée et utilise plus d’opérations de base. S’il vous plait corrigez moi si je me trompe. 🙂

Utilisez Ssortingng.Subssortingng() (détails ici ) pour couper la partie gauche, puis votre remplacement, puis la partie droite. Jouez avec les index jusqu’à ce que vous obteniez le résultat correct 🙂

Quelque chose comme:

 ssortingng replacement=original.Subssortingng(0,start)+ rep+original.Subssortingng(start+rep.Length); 
  ssortingng s = "ABCDEFG"; ssortingng t = "st"; s = s.Remove(4, t.Length); s = s.Insert(4, t); 

Comme méthode d’extension

 public static class SsortingngBuilderExtension { public static ssortingng SubsituteSsortingng(this ssortingng OriginalStr, int index, int length, ssortingng SubsituteStr) { return new SsortingngBuilder(OriginalStr).Remove(index, length).Insert(index, SubsituteStr).ToSsortingng(); } } 

Vous pouvez essayer quelque chose lien:

 ssortingng str = "ABCDEFGHIJ"; str = str.Subssortingng(0, 2) + "ZX" + str.Subssortingng(5); 

Comme d’autres l’ont mentionné, la fonction Subssortingng() est là pour une raison:

 static void Main(ssortingng[] args) { ssortingng input = "ABCDEFGHIJ"; ssortingng output = input.Overwrite(3, "ZX"); // 4th position has index 3 // ABCZXFGHIJ } public static ssortingng Overwrite(this ssortingng text, int position, ssortingng new_text) { return text.Subssortingng(0, position) + new_text + text.Subssortingng(position + new_text.Length); } 

J’ai aussi chronométré cela contre la solution SsortingngBuilder et obtenu 900 tics contre 875. Donc, c’est légèrement plus lent.

Avec l’aide de ce post, je crée la fonction suivante avec des contrôles de longueur supplémentaires

 public ssortingng ReplaceSsortingngByIndex(ssortingng original, ssortingng replaceWith, int replaceIndex) { if (original.Length >= (replaceIndex + replaceWith.Length)) { SsortingngBuilder rev = new SsortingngBuilder(original); rev.Remove(replaceIndex, replaceWith.Length); rev.Insert(replaceIndex, replaceWith); return rev.ToSsortingng(); } else { throw new Exception("Wrong lengths for the operation"); } } 

Encore un autre

  public static ssortingng ReplaceAtPosition(this ssortingng self, int position, ssortingng newValue) { return self.Remove(position, newValue.Length).Insert(position, newValue); } 
 s.Remove(3, 2).Insert(3, "ZX"); 

-> Cela ne fonctionne pas si la chaîne contient un caractère Unicode comme Emojis.

Avec ce sujet , j’étends la classe SsortingngInfo à Remplacer par la position en gardant l’algorithme de Nick Miller:

 public static class SsortingngInfoUtils { public static ssortingng ReplaceByPosition(this ssortingng str, ssortingng replaceBy, int offset, int count) { return new SsortingngInfo(str).ReplaceByPosition(replaceBy, offset, count).Ssortingng; } public static SsortingngInfo ReplaceByPosition(this SsortingngInfo str, ssortingng replaceBy, int offset, int count) { return str.RemoveByTextElements(offset, count).InsertByTextElements(offset, replaceBy); } public static SsortingngInfo RemoveByTextElements(this SsortingngInfo str, int offset, int count) { return new SsortingngInfo(ssortingng.Concat( str.SubssortingngByTextElements(0, offset), offset + count < str.LengthInTextElements ? str.SubstringByTextElements(offset + count, str.LengthInTextElements - count - offset) : "" )); } public static StringInfo InsertByTextElements(this StringInfo str, int offset, string insertStr) { if (string.IsNullOrEmpty(str?.String)) return new StringInfo(insertStr); return new StringInfo(string.Concat( str.SubstringByTextElements(0, offset), insertStr, str.LengthInTextElements - offset > 0 ? str.SubssortingngByTextElements(offset, str.LengthInTextElements - offset) : "" )); } } 

Il est préférable d’utiliser Ssortingng.substr() .

Comme ça:

 ReplSsortingng = GivenStr.substr(0, PostostarRelStr) + GivenStr(PostostarRelStr, ReplSsortingng.lenght()); 

Je cherchais une solution avec les exigences suivantes:

  1. n’utiliser qu’une seule expression d’une ligne
  2. n’utiliser que des méthodes intégrées au système (pas d’utilitaire implémenté)

Solution 1

La solution qui me convient le mieux est la suivante:

 // replace `oldSsortingng[i]` with `c` ssortingng newSsortingng = new SsortingngBuilder(oldSsortingng).Replace(oldSsortingng[i], c, i, 1).ToSsortingng(); 

Cela utilise SsortingngBuilder.Replace(oldChar, newChar, position, count)

Solution 2

L’autre solution qui répond à mes besoins est d’utiliser Subssortingng avec concaténation:

 ssortingng newSsortingng = oldStr.Subssortingng(0, i) + c + oldSsortingng.Subssortingng(i+1, oldSsortingng.Length); 

C’est bien aussi. Je suppose que ce n’est pas aussi efficace que la première performance en raison de la 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 🙂

Je crois que la manière la plus simple serait ceci: (sans ssortingngbuilder)

 ssortingng mySsortingng = "ABCDEFGHIJ"; char[] replacementChars = {'Z', 'X'}; byte j = 0; for (byte i = 3; i <= 4; i++, j++) { myString = myString.Replace(myString[i], replacementChars[j]); } 

Cela fonctionne car une variable de type ssortingng peut être traitée comme un tableau de variables char. Vous pouvez, par exemple, faire référence au second caractère d'une variable de chaîne nommée "mySsortingng" comme mySsortingng [1]