string myString = "ABCDEFGHIJ";
string modifiedString = new StringBuilder(myString){[3]='Z', [4]='X'}.ToString();
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îne Concat()
ou d'une chaîne Remove()
et d'une Insert()
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, les StringBuilder
expose via la propriété d'indexeur qui ressemble à quelque chose comme ci-dessous
[IndexerName("Chars")]
public char this[int index]
{
get
{
StringBuilder stringBuilder = this;
do
{
// … some code
return stringBuilder.m_ChunkChars[index1];
// … some more code
}
}
set
{
StringBuilder stringBuilder = this;
do
{
//… some code
stringBuilder.m_ChunkChars[index1] = value;
return;
// …. Some more code
}
}
}
Ma 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
string myString = "ABCDEFGHIJ";
StringBuilder tempString = new StringBuilder(myString);
tempString[3] = 'Z';
tempString[4] = 'X';
string modifiedString = tempString.ToString();
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 utiliser StringBuilder
pour modifier le tableau de caractères.
[IndexerName("Chars")]
public extern char this[int index] { [SecuritySafeCritical, __DynamicallyInvokable, MethodImpl(MethodImplOptions.InternalCall)] get; }
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.