Ich habe diese Zeichenfolge: ABCDEFGHIJ
Ich muss von Position 4 auf Position 5 durch die Zeichenfolge ersetzen ZX
Es wird so aussehen: ABCZXFGHIJ
Aber nicht mit zu verwenden string.replace("DE","ZX")
- ich muss mit Position verwenden
Wie kann ich es tun?
Antworten:
Der einfachste Weg, Bereiche in einer Zeichenfolge hinzuzufügen und zu entfernen, ist die Verwendung von
StringBuilder
.Eine Alternative ist die Verwendung
String.Substring
, aber ich denke, derStringBuilder
Code wird besser lesbar.quelle
quelle
ReplaceAt (int index, int length, string replace)
Hier ist eine Erweiterungsmethode, die weder StringBuilder noch Teilzeichenfolge verwendet. Diese Methode ermöglicht es der Ersetzungszeichenfolge auch, sich über die Länge der Quellzeichenfolge hinaus zu erstrecken.
Wenn Sie bei Verwendung dieser Funktion möchten, dass die gesamte Ersatzzeichenfolge so viele Zeichen wie möglich ersetzt, setzen Sie die Länge auf die Länge der Ersatzzeichenfolge:
Andernfalls können Sie die Anzahl der Zeichen angeben, die entfernt werden sollen:
Wenn Sie die Länge auf 0 setzen, verhält sich diese Funktion genauso wie die Einfügefunktion:
Ich denke, dies ist effizienter, da die StringBuilder-Klasse nicht initialisiert werden muss und grundlegendere Operationen verwendet werden. Bitte korrigieren Sie mich, wenn ich falsch liege. :) :)
quelle
Verwenden Sie
String.Substring()
(Details hier ), um das linke Teil, dann Ihren Ersatz und dann das rechte Teil zu schneiden. Spielen Sie mit Indizes, bis Sie es richtig machen :)Etwas wie:
quelle
Als Erweiterungsmethode.
quelle
quelle
t
wieder zurücksetzen.Wenn Sie Wert auf Leistung legen, sollten Sie hier Zuweisungen vermeiden. Und wenn Sie auf .NET - Core - 2.1+ (oder, noch unveröffentlicht, .Net Standard 2.1), dann können Sie, unter Verwendung der
string.Create
Methode :Dieser Ansatz ist schwerer zu verstehen als die Alternativen, aber es ist der einzige, der nur ein Objekt pro Aufruf zuweist: die neu erstellte Zeichenfolge.
quelle
Sie könnten versuchen, etwas zu verlinken:
quelle
Wie andere bereits erwähnt haben, gibt es die
Substring()
Funktion aus einem Grund:Außerdem habe ich dies gegen die
StringBuilder
Lösung abgestimmt und 900 Tics gegen 875 erhalten. Es ist also etwas langsamer.quelle
"ABCDEFGHIJ"
und"ZX"
sind unterschiedlich lang.Noch ein anderer
quelle
Mit Hilfe dieses Beitrags erstelle ich folgende Funktion mit zusätzlichen Längenprüfungen
quelle
Alle anderen Antworten funktionieren nicht, wenn die Zeichenfolge Unicode-Zeichen enthält (wie Emojis), da ein Unicode-Zeichen mehr Bytes als ein Zeichen wiegt.
Mit diesem Thema erweitere ich die StringInfo-Klasse auf Ersetzen, indem ich den Algorithmus von Nick Miller behalte, um Folgendes zu vermeiden:
quelle
Ich suchte nach einer Lösung mit folgenden Anforderungen:
Lösung 1
Die Lösung, die am besten zu mir passt, ist folgende:
Dies verwendet
StringBuilder.Replace(oldChar, newChar, position, count)
Lösung 2
Die andere Lösung, die meine Anforderungen erfüllt, ist die Verwendung
Substring
mit Verkettung:Das ist auch in Ordnung. Ich denke, es ist nicht so effizient wie das erste in Bezug auf die Leistung (aufgrund unnötiger Verkettung von Zeichenfolgen). Aber vorzeitige Optimierung ist die Wurzel allen Übels .
Also wähle die aus, die dir am besten gefällt :)
quelle
Es ist besser, die zu verwenden
String.substr()
.So was:
quelle
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()
ZeichenfolgeConcat()
oder eine ZeichenfolgeRemove()
und einenInsert()
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 ansehenStringBuilder
, 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, werdenStringBuilder
sie über die Indexer-Eigenschaft verfügbar gemacht, die wie folgt aussiehtMeine 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
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 wirStringBuilder
das Zeichenarray ändern.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ß.
quelle
quelle
Hier ist eine einfache Erweiterungsmethode:
Verwenden Sie es so:
quelle
Ich glaube, der einfachste Weg wäre folgender: (ohne Stringbuilder)
Dies funktioniert, weil eine Variable vom Typ string als Array von Zeichenvariablen behandelt werden kann. Sie können beispielsweise das zweite Zeichen einer Zeichenfolgenvariablen mit dem Namen "myString" als myString [1] bezeichnen.
quelle
string
zu ersetzenden Zeichen jeweils nur einmal vorkommen. Wenn Sie dies beispielsweise ausführen, erhalten"DBCDEFGHIE"
Sie"ZBCZXFGHIX"
, was nicht das gewünschte Ergebnis ist. Ich würde auch nicht zustimmen, dass dies einfacher ist als die anderen Nicht-StringBuilder
, die vor zweieinhalb Jahren veröffentlicht wurden.