Это то, что я знаю
str = String.Format("Her name is {0} and she {1} years old", "Lisa", "10");
Но я хочу что-то вроде
str = String("Her name is @name and she @age years old");
str.addParameter(@name, "Lisa");
str.addParameter(@age, 10);
Это то, что я знаю
str = String.Format("Her name is {0} and she {1} years old", "Lisa", "10");
Но я хочу что-то вроде
str = String("Her name is @name and she @age years old");
str.addParameter(@name, "Lisa");
str.addParameter(@age, 10);
В С# 6 вы можете использовать интерполяцию строк:
string name = "Lisa";
int age = 20;
string str = $"Her name is {name} and she {age} years old";
Как Doug Clutter, упомянутый в его комментарий, интерполяция строк также поддерживает строка формата. Можно изменить формат, указав его после двоеточия. В следующем примере будет выводиться число с запятой и двумя знаками после запятой:
var str = $"Your account balance is {balance:N2}"
Как Bas, упомянутый в его > , строка-интерполяция не поддерживает строку шаблона. На самом деле, для этого нет поддержки. К счастью, он существует в некоторых больших библиотеках.
SmartFormat.NET, например, поддерживает именованный 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; }
}
Он доступен на NuGet.
Усы - отличное решение. Bas хорошо описал свои профи в его ответе.
Если вам достаточно назначить локальную переменную, содержащую данные, которые вы используете для замены параметров шаблона, вы можете использовать функцию интерполяции строк .
Основной принцип заключается в том, что вы можете сделать довольно сложную логику замены строк на основе входных данных.
Простой пример:
string name = "John";
string message = $"Hello, my name is {name}."
Сложный пример:
List<string> strings = ...
string summary = $"There are {strings.Count} strings. "
+ $"The average length is {strings.Select(s => s.Length).Average()}"
Недостатки:
(Основные):
Хорошее решение с открытым исходным кодом, которое имеет почти такой же синтаксис, Mustache. Он имеет две доступные реализации С# из того, что я мог найти - mustache-sharp и Nustache.
Я работал с mustache-sharp
и обнаружил, что он не имеет такой же мощности, как и интерполяция строк, но близок. Например. вы можете сделать следующее (украденное с него страница github).
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}}
С С# 6 вы можете использовать String Interpolation, чтобы напрямую добавлять переменные в строку.
Например:
string name = "List";
int age = 10;
var str = $"Her name is {name} and she {age} years old";
Обратите внимание: использование знака доллара ($
) перед форматированием строки.
Так почему бы просто не заменить?
string str = "Her name is @name and she @age years old";
str = str.Replace("@name", "Lisa");
str = str.Replace("@age", "10");
Если у вас нет С# 6, доступного в вашем проекте, вы можете использовать Linq.Aggregate():
var str = "Her name is @name and she @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()));
Если вы хотите, чтобы что-то соответствовало конкретному синтаксису в вопросе, вы можете собрать довольно простой класс на основе 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()));
}
}
Используется как:
var str = new StringFormatter("Her name is @name and she @age years old");
str.Add("@name", "Lisa");
str.Add("@age", 10);
Console.WriteLine(str);
Обратите внимание, что это чистый код, предназначенный для простого понимания производительности.
Нет встроенного способа сделать это, но вы можете написать класс, который сделает это за вас.
Что-то вроде этого может вас начать:
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();
}
}
Обратите внимание, что этот пример не принуждает к назначению имени параметра. Это означает, что вы должны очень тщательно выбирать имена параметров, иначе вы могли бы заменить части строки, которую вы не намеревались.
Строковая интерполяция - хорошее решение, но для этого требуется С# 6.
В таком случае я использую StringBuilder
var sb = new StringBuilder();
sb.AppendFormat("Her name is {0} ", "Lisa");
sb.AppendFormat("and she {0} years old", "10");
// You can add more lines
string result = sb.ToString();
string name = "Lisa";
int age = 20;
string str = $"Her name is {name} and she {age} years old";
Это называется Interpolated String, который представляет собой в основном строку шаблона, содержащую выражения внутри нее.
Вы также можете использовать выражения с интерполяцией строк С# 6:
string name = "Lisa";
int age = 20;
string str = $"Her name is {name} and she {age} year{(age == 1 ? "" : "s")} old";