самый быстрый способ заменить строку в шаблоне - PullRequest
14 голосов
/ 06 июня 2009

У меня есть шаблон строки

это моя {0} строка шаблона {1}

, который я планирую использовать для использования пользовательских значений String.Format().

Строка на самом деле длиннее, поэтому для удобства чтения я использую:

это моя {goodName1} шаблон {goodName2} строка

А затем String.Replace каждый параметр со своим значением.

Как получить максимальную производительность и удобочитаемость?

Может быть, мне не нужно иметь этот шаблон в файле (как сейчас), а динамически создавать его, конкатенируя в построитель строк и добавляя параметры при необходимости? Хотя это менее читабельно.

Какие у меня есть другие варианты?

Ответы [ 9 ]

41 голосов
/ 06 июня 2009

Вы можете поместить параметры в словарь и использовать метод Regex.Replace для замены всех параметров за одну замену. Таким образом, метод хорошо масштабируется, если строка шаблона становится длинной или число параметров увеличивается.

Пример:

Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("goodName1", "asdf");
parameters.Add("goodName2", "qwerty");
string text = "this is my {goodName1} template {goodName2} string";
text = Regex.Replace(text, @"\{(.+?)\}", m => parameters[m.Groups[1].Value]);
16 голосов
/ 06 июня 2009
7 голосов
/ 06 июня 2009

Мое спонтанное решение будет выглядеть так:

string data = "This is a {template1} that is {template2}.";

Dictionary<string, string> replacements = new Dictionary<string, string>(){
    {"{template1}", "car"},
    {"{template2}", "red"},
};

foreach (string key in replacements.Keys)
{
    data = data.Replace(key, replacements[key]);
}
Console.WriteLine(data); // outputs "This is a car that is red."

Я использовал этот вид замены шаблонов в нескольких реальных проектах и ​​никогда не считал, что это проблема производительности. Поскольку его легко использовать и понимать, я не видел причин для его значительного изменения.

7 голосов
/ 06 июня 2009

Как и все, это зависит. Если код будет вызываться миллионы раз в день, подумайте о производительности. Если это несколько раз в день, тогда читайте.

Я провел несколько сравнительных тестов между использованием обычных (неизменяемых) строк и StringBuilder. Пока вы не начнете делать огромное количество за небольшое время, вам не нужно беспокоиться об этом слишком много.

3 голосов
/ 07 июня 2009

ОСТЕРЕГАЙТЕСЬ о том, чтобы увязнуть в этом типе мышления. Если этот код не выполняется сотни раз в минуту, а размер файла шаблона составляет несколько килобайт, более важно выполнить его. Не тратьте ни минуты на размышления о таких проблемах. В общем, если вы много делаете со строковыми манипуляциями, используйте построитель строк. У него даже есть метод Replace. Но зачем? Когда вы закончите, и если вы обнаружите, что у вас есть проблемы с производительностью, используйте PerfMon и исправьте РЕАЛЬНЫЕ узкие места в это время.

2 голосов
/ 17 ноября 2012

То же самое выше, что Фредрик опубликовал выше, но с linq.

    public static string FindandReplace(this string inputText, Dictionary<string, string> placeHolderValues)
    {
        if (!string.IsNullOrEmpty(inputText))
        {
            return placeHolderValues.Keys.Aggregate(inputText, (current, key) => current.Replace(key, placeHolderValues[key]));
        }
        else return inputText;
    }
0 голосов
/ 29 марта 2013

Только что изменил приведенный выше ответ на следующий:

    string data = "This is a {template1} that is {template2}.";

    Dictionary<string, string> replacements = new Dictionary<string, string>(){
        {"{template1}", "car"},
        {"{template2}", "red"},
    };

    data.Parse(replacements);

Метод расширения:

public static class Parser
{
    public static string Parse(this string template, Dictionary<string, string> replacements)
    {
        if (replacements.Count > 0)
        {
            template = replacements.Keys
                        .Aggregate(template, (current, key) => current.Replace(key, replacements[key]));
        }
        return template;
    }
}

Надеюсь, это поможет ..:)

0 голосов
/ 06 июня 2009

Если вам нужен хороший, быстрый, но простой движок шаблонов, вам следует проверить StringTemplate. Для простых шаблонов, которые не требуют никакой логики или управления потоком в самом шаблоне, StringTemplate имеет значение GREAT.

http://www.stringtemplate.org/download.html

0 голосов
/ 06 июня 2009

Самый быстрый способ сделать это - использовать StringBuilder, используя отдельные вызовы StringBuilder.Append(), например:

string result = new StringBuilder("this is my ")
                 .Append(UserVar1)
                 .Append(" template ")
                 .Append(UserVar2)
                 .Append(" string")
                 .ToString();

Я тщательно протестировал код фреймворка , и этот будет самым быстрым. Если вы хотите улучшить читабельность, вы можете оставить отдельную строку для отображения пользователю и просто использовать ее в фоновом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...