Как добавить заполнитель фигурных скобок в словарные ключи - PullRequest
0 голосов
/ 25 сентября 2018

Итак, у меня есть словарь, как показано ниже:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("first", "Value1");
dict.Add("second", "Value2");

И у меня есть строка, подобная приведенной ниже:

rawMsg = "My values are {first} and {second}.";

Ожидаемый результат:

My values are Value1 and Value2.

Код форматирования строки:

public void Format(string rawMsg, Dictionary<string, object> dict)
{
    var temp = dict.Aggregate(rawMsg, (current, parameter) => current.Replace(parameter.Key, parameter.Value.ToString())); 
}

Для работы вышеуказанного кода мне нужно добавить ключи, как показано ниже:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("{first}", "Value1"); // Notice the curly braces in Keys
dict.Add("{second}", "Value2");

Но я неЯ хочу добавить фигурные скобки в ключ.

Я хочу добавить фигурные скобки в моем формате Логика.

Псевдокод:

public void Format(string rawMsg, Dictionary<string, object> dict)
{
    // loop through all the keys and append a curly braces in them.
    var temp = dict.Aggregate(rawMsg, (current, parameter) => current.Replace(parameter.Key, parameter.Value.ToString())); 
}

Но я не знаю эффективного способа сделать это.Пожалуйста, ведите меня.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Если вы создаете собственную строковую интерполяцию , я предлагаю регулярные выражения , например:

  Dictionary<string, object> dict = new Dictionary<string, object>() {
    {"first", "Value1" },
    {"second", "Value2" },
  };

  string rawMsg = "My values are {first} and {second}.";

  string result = Regex.Replace(
    rawMsg, 
   @"\{[^{}]+?\}", 
    match => dict[match.Value.Substring(1, match.Value.Length - 2)]?.ToString());

  Console.Write(result);

Результат:

  My values are Value1 and Value2.

PS Я предположил, что вы хотите внести все изменения в один раз , т. Е. Для

  Dictionary<string, object> dict = new Dictionary<string, object>() {
    {"first", "{second}" },
    {"second", "third" },
  };

  string rawMsg = "My values are {{first}} and {second}.";

Правильный ответ

  My values are {second} and third.

Нет (мы не хотим обрабатывать second дважды )

  My values are third and third.
0 голосов
/ 25 сентября 2018

Это должно работать.Короче говоря, создание регулярного выражения и его сохранение в статическом элементе для компиляции только один раз, а затем использование его для замены вхождений заполнителя их значением в строке ( Fiddle ).

private static Regex _regex = new Regex(@"(?<={)(\w+)");

...

public string Format(string rawMsg, IReadOnlyDictionary<string, object> dict) =>

    _regex.Replace(rawMsg, match =>
    {
        string placeHolder = match.ToString();

        return dict.TryGetValue(placeHolder, out object placeHolderValue) 
                   ? placeHolderValue.ToString() : null;
    });

Обратите внимание, что первая группа регулярных выражений не захватывает, чтобы исключить фигурные скобки из захватов.

0 голосов
/ 25 сентября 2018

Просто добавьте, когда вам это нужно?

public void Format(string rawMsg, Dictionary<string, object> dict)
{
    var temp = dict.Aggregate(rawMsg, (current, parameter) => current.Replace("{" + parameter.Key + "}", parameter.Value.ToString())); 
}
...