Reputation: 1105
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
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
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
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
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
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
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
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