string myString = "ABCDEFGHIJ";
string modifiedString = new StringBuilder(myString){[3]='Z', [4]='X'}.ToString();
Lassen Sie mich meine Lösung erklären.
Angesichts der Problemstellung, eine Zeichenfolge an ihren zwei spezifischen Positionen („Position 4 bis Position 5“) mit den beiden Zeichen 'Z' und 'X' zu ändern, wird gefragt, ob der Positionsindex zum Ändern der Zeichenfolge und nicht der Zeichenfolge Ersetzen ( ) Methode (möglicherweise aufgrund der Möglichkeit der Wiederholung einiger Zeichen in der tatsächlichen Zeichenfolge), würde ich es vorziehen, einen minimalistischen Ansatz zu verwenden, um das Ziel zu erreichen, anstatt eine Substring()
Zeichenfolge Concat()
oder eine Zeichenfolge Remove()
und einen Insert()
Ansatz zu verwenden. Obwohl all diese Lösungen dem Zweck dienen, dasselbe Ziel zu erreichen, hängt es nur von der persönlichen Wahl und der Philosophie ab, sich mit einem minimalistischen Ansatz abzufinden.
Kommen wir zurück oben auf meiner Lösung zu erwähnen, wenn wir einen genaueren Blick nehmen string
undStringBuilder
Beide behandeln eine bestimmte Zeichenfolge intern als ein Array von Zeichen. Wenn wir uns die Implementierung ansehen StringBuilder
, wird eine interne Variable wie " internal char[] m_ChunkChars;
" beibehalten , um die angegebene Zeichenfolge zu erfassen. Da dies eine interne Variable ist, können wir nicht direkt darauf zugreifen. Damit die Außenwelt auf dieses Zeichenarray zugreifen und es ändern kann, werden StringBuilder
sie über die Indexer-Eigenschaft verfügbar gemacht, die wie folgt aussieht
[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
}
}
}
Meine oben erwähnte Lösung nutzt diese Indexerfunktion, um das intern verwaltete Zeichenarray, das IMO effizient und minimalistisch ist, direkt zu ändern.
Übrigens; Wir können die obige Lösung ausführlicher umschreiben, so etwas wie unten
string myString = "ABCDEFGHIJ";
StringBuilder tempString = new StringBuilder(myString);
tempString[3] = 'Z';
tempString[4] = 'X';
string modifiedString = tempString.ToString();
In diesem Zusammenhang möchte string
ich auch erwähnen, dass es in diesem Fall auch eine Indexer-Eigenschaft als Mittel zum Offenlegen seines internen Zeichenarrays gibt, in diesem Fall jedoch nur eine Getter-Eigenschaft (und keinen Setter), da die Zeichenfolge unveränderlich ist. Und deshalb müssen wir StringBuilder
das Zeichenarray ändern.
[IndexerName("Chars")]
public extern char this[int index] { [SecuritySafeCritical, __DynamicallyInvokable, MethodImpl(MethodImplOptions.InternalCall)] get; }
Und last but not least ist diese Lösung nur für dieses spezielle Problem am besten geeignet, bei dem nur wenige Zeichen im Voraus durch einen bekannten Positionsindex ersetzt werden müssen. Es ist möglicherweise nicht die beste Anpassung, wenn eine ziemlich lange Zeichenfolge geändert werden muss, dh die Anzahl der zu ändernden Zeichen ist groß.