DarkNightFan
DarkNightFan

Reputation: 1105

Insert variable values in the middle of a string

In C#: If I want to create a message like this: "Hi We have these flights for you: Flight A,B,C,D. Which one do you want"

where just the section in bold is dynamic and I pass its value at run time, but its left and right parts are fixed. I can create something like LeftMessage + those variables + RightMessage to create this. But I was wondering if there is a way of doing it all at once without the need to create two separate left and right messages?

For translation purposes I am putting those left and right messages inside string resources so now I have two separate string resources. Is there a way to do it all at once?

Upvotes: 72

Views: 261295

Answers (7)

Jonne Kleijer
Jonne Kleijer

Reputation: 701

A consideration to not use string interpolation even after C# 6.0 is logging (e.g. Microsoft.Extensions.Logging or Serilog). My preference is the message template:

var flights = "A, B, C, D";
logger.Information(string.Format("Flights: {0}. Please choose:", flights));

Instead of string interpolation:

logger.Information($"Flights: {flights}. Please choose:");

Because log services, like Azure's Application Insights or Amazon's CloudWatch Logs, use the parameters of the template and allow for filtering on those parameters as properties on the log message. With string interpolation you lose that information, because it's converted to a string.

For more explanation, see Nick Chapsas's video.

Upvotes: 1

Vimes
Vimes

Reputation: 11967

There's now (C# 6) a more succinct way to do it: string interpolation.

From another question's answer:

In C# 6 you can use string interpolation:

string name = "John";
string result = $"Hello {name}";

The syntax highlighting for this in Visual Studio makes it highly readable and all of the tokens are checked.

Upvotes: 153

Dan Puzey
Dan Puzey

Reputation: 34218

You can use string.Format:

string template = "Hi We have these flights for you: {0}. Which one do you want";
string data = "A, B, C, D";
string message = string.Format(template, data);

You should load template from your resource file and data is your runtime values.

Be careful if you're translating to multiple languages, though: in some cases, you'll need different tokens (the {0}) in different languages.

Upvotes: 73

Joydeep Sarkar
Joydeep Sarkar

Reputation: 101

I would use a StringBuilder class for doing string manipulation as it will more efficient (being mutable)

string flights = "Flight A, B,C,D";
StringBuilder message = new StringBuilder();
message.Append("Hi We have these flights for you: ");
message.Append(flights);
message.Append(" . Which one do you want?");

Upvotes: 0

codingbiz
codingbiz

Reputation: 26406

Use String.Format

Pre C# 6.0

string data = "FlightA, B,C,D";
var str = String.Format("Hi We have these flights for you: {0}. Which one do you want?", data);

C# 6.0 -- String Interpolation

string data = "FlightA, B,C,D";
var str = $"Hi We have these flights for you: {data}. Which one do you want?";

http://www.informit.com/articles/article.aspx?p=2422807

Upvotes: 40

Paolo Falabella
Paolo Falabella

Reputation: 25874

String.Format("Hi We have these flights for you: {0}. Which one do you want",
                              flights);

EDIT: you can even save the "template" string separately (for instance you could store it in a configuration file and retrieve it from there), like this:

string flights = "Flight A, B,C,D";

string template = @"Hi We have these flights for you: {0}. Which one do you want";
Console.WriteLine(String.Format(template, flights));

EDIT2: whoops, sorry I see that @DanPuzey had already suggested something very similar to my EDIT (but somewhat better)

Upvotes: 11

Aghilas Yakoub
Aghilas Yakoub

Reputation: 29000

1 You can use string.Replace method

var sample = "testtesttesttest#replace#testtesttest";
var result = sample.Replace("#replace#", yourValue);

2 You can also use string.Format

var result = string.Format("your right part {0} Your left Part", yourValue);

3 You can use Regex class

Upvotes: 2

Related Questions