Stack Overflow is a community of 4.7 million programmers, just like you, helping each other.

Join them; it only takes a minute:

Sign up
Join the Stack Overflow community to:
  1. Ask programming questions
  2. Answer and help your peers
  3. Get recognized for your expertise

This is what I know

str = String.Format("Her name is {0} and she's {1} years old", "Lisa", "10");

But I want something like

str = String("Her name is @name and she's @age years old");
str.addParameter(@name, "Lisa");
str.addParameter(@age, 10);
share|improve this question
3  
Why you require such format? whats wrong with .Format – un-lucky 2 days ago
2  
There is no "standard" way, but there are many approaches - eg. stackoverflow.com/questions/159017/… , stackoverflow.com/questions/20278554/… Also, consider a library like StringTemplate (or whatnot) if this is more than a simple one-off case. – user2864740 2 days ago
3  
@un-lucky I'm formatting a very long string and when I have to edit it it's very hard – user33540 2 days ago
5  
You can use var name = "Lisa"; var age = 10; var str = $"Her name is {name} and she's {age} years old;" in C#6 – Rob 2 days ago
2  
@ZoharPeled readability is one advantage, if you have many parameters it becomes hard to track what goes where. – Bas 2 days ago
up vote 63 down vote accepted

In C# 6 you can use string interpolation :

string name = "Lisa";
int age = 20;
string str = $"Her name is {name} and she's {age} years old";

Edit 1 :

As Doug Clutter mentioned in his comment, string interpolation also support format string. It's possible to change the format by specifying it after a colon. The following example will output a number with a comma and 2 decimals place :

var str = $"Your account balance is {balance:N2}"

Edit 2 :

As Bas mentioned in his answer, string interpolation doesn't support template string. Actually, it have no built in support for that. Fortunatly it exist some great libraries.


SmartFormat.NET for example has a support for named placeholder :

Smart.Format("{Name} from {Address.City}, {Address.State}", user)

// The user object should at least be like that 

public class User
{
    public string Name { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string City { get; set; }
    public string State { get; set; }
}

It is available on NuGet.


Mustache is also a great solution. Bas has well described it's pros in his answer.

share|improve this answer
3  
You can also use format strings. For instance to show a number with commas and 2 decimal places: $"Your account balance is {balance:N2}." – Doug Clutter yesterday
    
@DougClutter you have been mentioned in my anwer. Thanks by the way. – Fabien yesterday

If you are ok assigning a local variable that contains the data you use to replace the template parameters, you can use the C# 6.0 string interpolation feature.

The basic principle is that you can do fairly advanced string replacement logic based on input data.

Simple example:

string name = "John";
string message = $"Hello, my name is {name}."

Complex example:

List<string> strings = ...
string summary = $"There are {strings.Count} strings. " 
  + $"The average length is {strings.Select(s => s.Length).Average()}"

Drawbacks:

  • No support for dynamic templates (e.g. from a resources file)

(Major) advantages:

  • It enforces compile time checks on your template replacement.

A nice open source solution that has almost the same syntax, is Mustache. It has two available C# implementations from what I could find - mustache-sharp and Nustache.

I have worked with mustache-sharp and found that it does not have the same power as the string interpolation, but comes close. E.g. you can do the following (stolen from it's github page).

Hello, {{Customer.Name}}
{{#newline}}
{{#newline}}
{{#with Order}}
{{#if LineItems}}
Here is a summary of your previous order:
{{#newline}}
{{#newline}}
{{#each LineItems}}
    {{ProductName}}: {{UnitPrice:C}} x {{Quantity}}
    {{#newline}}
{{/each}}
{{#newline}}
Your total was {{Total:C}}.
{{#else}}
You do not have any recent purchases.
{{/if}}
{{/with}}
share|improve this answer

With C# 6 you can use String Interpolation to directly add variables into a string.

For example:

string name = "List";
int age = 10;

var str = $"Her name is {name} and she's {age} years old";

Note, the use of the dollar sign ($) before the string format.

share|improve this answer
2  
I think the String.Format call is useless here since you are using string interpolation. – Fabien 2 days ago
    
@Fabien you're correct, edited. And seems like you got in just ahead of me. – Steve 2 days ago

So why not just Replace?

string str = "Her name is @name and she's @age years old";
str = str.Replace("@name", "Lisa");
str = str.Replace("@age", "10");
share|improve this answer
    
this will generate as many additional strings as you have variables, which may not be desired – jk. 2 days ago
    
Why not? Perhaps many reasons. It takes three lines instead of one. If @name contains @age it will be interpolated, but not vice versa. It is inefficient, scanning the string once for every variable. @ can't be escaped with, say, \@ or @@. – John Kugelman 2 days ago

string interpolation is a good solution however it requires C#6.

In such case I am using StringBuilder

var sb = new StringBuilder();

sb.AppendFormat("Her name is {0} ", "Lisa");
sb.AppendFormat("and she's {0} years old", "10");
// You can add more lines

string result = sb.ToString();
share|improve this answer

There is no built in way to do this, but you can write a class that will do it for you.
Something like this can get you started:

public class ParameterizedString
{
    private string _BaseString;
    private Dictionary<string, string> _Parameters;

    public ParameterizedString(string baseString)
    {
        _BaseString = baseString;
        _Parameters = new Dictionary<string, string>();
    }

    public bool AddParameter(string name, string value)
    {
        if(_Parameters.ContainsKey(name))
        {
            return false;
        }
        _Parameters.Add(name, value);
        return true;
    }

    public override string ToString()
    {
        var sb = new StringBuilder(_BaseString);
        foreach (var key in _Parameters.Keys)
        {
            sb.Replace(key, _Parameters[key]);
        }
        return sb.ToString();
    }
}

Note that this example does not force any parameter name convention. This means that you should be very careful picking your parameters names otherwise you might end up replacing parts of the string you didn't intend to.

share|improve this answer

If you don't have C#6 available in your project you can use Linq's .Aggregate():

    var str = "Her name is @name and she's @age years old";

    var parameters = new Dictionary<string, object>();
    parameters.Add("@name", "Lisa");
    parameters.Add("@age", 10);

    str = parameters.Aggregate(str, (current, parameter)=> current.Replace(parameter.Key, parameter.Value.ToString()));

If you want something matching the specific syntax in the question you can put together a pretty simple class based on Aggregate:

public class StringFormatter{

    public string Str {get;set;}

    public Dictionary<string, object> Parameters {get;set;}

    public StringFormatter(string p_str){
        Str = p_str;
        Parameters = new Dictionary<string, object>();
    }

    public void Add(string key, object val){
        Parameters.Add(key, val);
    }

    public override string ToString(){
        return Parameters.Aggregate(Str, (current, parameter)=> current.Replace(parameter.Key, parameter.Value.ToString()));
    }

}

Usable like:

var str = new StringFormatter("Her name is @name and she's @age years old");
str.Add("@name", "Lisa");
str.Add("@age", 10);

Console.WriteLine(str);

Note that this is clean-looking code that's geared to being easy-to-understand over performance.

share|improve this answer
    
Impressive Thank a lot – user33540 yesterday
    string name = "Lisa";
    int age = 20;
    string str = $"Her name is {name} and she's {age} years old";

This is called an Interpolated String, which is a basically a template string that contains expressions inside of it.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.