web-dev-qa-db-fra.com

C # remplace la chaîne dans la chaîne

Est-il possible de remplacer une sous-chaîne dans une chaîne sans affecter de valeur de retour?

J'ai une ficelle:

string test = "Hello [REPLACE] world";

et je veux remplacer la chaîne [REPLACE] par quelque chose d'autre:

test = test.replace("[REPLACE]", "test");

Cela fonctionne bien, mais comment puis-je le faire sans affecter la valeur de retour à une variable? Je veux quelque chose comme ça:

test.replace("[REPLACE]", "test");
12
jeb

Vous ne pouvez pas, carstring est immuable . Il a été conçu de sorte que toute "modification" apportée à une chaîne entraîne la création d'un nouvel objet string. En tant que tel, si vous n'attribuez pas la valeur de retour (c'est-à-dire la chaîne "mise à jour", une copie de la chaîne d'origine avec les modifications appliquées), vous avez effectivement ignoré les modifications que vous vouliez apporter.

Si vous souhaitez effectuer des modifications sur place, vous pouvez théoriquement travailler directement avec un char[] (tableau de caractères), mais cela est dangereux et doit être évité.

Une autre option (comme M. Skeet l’a souligné ci-dessous) consiste à utiliser StringBuilder et sa méthode Replace(). Cela étant dit, de simples remplacements, comme celui que vous avez montré, sont assez rapides, vous ne voudrez peut-être pas vous embêter avec une StringBuilder à moins que vous ne le fassiez assez souvent.

26
dlev

Comme mentionné par dlev, vous ne pouvez pas faire cela avec string car les chaînes sont immuabledans .NET - une fois qu'une chaîne a été construite, vous ne pouvez rien faire (à l'exception du code non sécurisé ou de la réflexion) pour modifier le contenu. rend les chaînes généralement plus facile, car vous n'avez pas à vous soucier de la copie défensive, elles sont naturellement thread-safe, etc.

Son cousin mutable, cependant, est StringBuilder - qui dispose de la méthode Replace pour effectuer un remplacement dans l'objet. Par exemple:

string x = "Hello [first] [second] world";

StringBuilder builder = new StringBuilder(x);
builder.Replace("[first]", "1st");
builder.Replace("[second]", "2nd");

string y = builder.ToString(); // Value of y is "Hello 1st 2nd world"
24
Jon Skeet

Tu ne peux pas. Vous devez attribuer la valeur car les chaînes sont immuables

http://msdn.Microsoft.com/en-us/library/362314fe.aspx

2
CaffGeek

Les chaînes en .NET sont immuables, elles ne peuvent pas être éditées en ligne.

Le plus proche de l'édition en ligne consiste à créer une variable StringBuilder à partir d'une chaîne, à modifier son contenu en ligne, puis à la faire recracher une chaîne. Mais cela produira toujours une nouvelle chaîne plutôt que de modifier l'original. Il est toutefois utile d’éviter de générer beaucoup de chaînes intermédiaires lorsque vous jouez beaucoup de violon, par exemple. en boucle.

1
Paul Ruane

Vous ne pouvez pas, les chaînes sont immuables dans .NET

1
Davy8

Vous ne pouvez pas, en C #, les chaînes sont immuables. Quelque chose comme ça violerait ça. Vous devez avoir le type de chaîne retourné, car celle avec laquelle vous travaillez ne peut pas changer.

0
Alexander Kahoun

Voici le code pour extraire string de html et le passer StringBuilder et définir la valeur de votre variable.Vous ne pouvez pas faire string.replace.Vous devez utiliser StringBuilder lors de la manipulation.Here dans la page html, j’ajoute [Nom] qui est remplacé par code behind.make que [Name] est unique ou vous pouvez donner un nom unique.

 string Name = txtname.Text;
 string contents = File.ReadAllText(Server.MapPath("~/Admin/invoice.html"));

                StringBuilder builder = new StringBuilder(contents);

                builder.Replace("[Name]", Name);

                StringReader sr = new StringReader(builder.ToString());
0
saktiprasad swain