самый быстрый путь к строке замены в шаблоне

Классическим сценарием является паттерн MVP с пассивным представлением. Форма реализует интерфейс представления, который имеет событие NameChanged. Презентатор, который создает / использует представление, подписывается на это событие. При изменении текста имени в текстовом поле это событие запускается. Затем докладчик уведомляется. Поскольку докладчик знает о событии только из интерфейса представления, вы можете предоставить имитирующее представление для тестирования. Представление полностью отделено от ведущего.

15
задан Joel Coehoorn 6 June 2009 в 15:47
поделиться

7 ответов

17
ответ дан 30 November 2019 в 23:50
поделиться

You can put the parameters in a dictionary and use the Regex.Replace method to replace all of the parameters in one replacement. That way the method scales well if the template string gets long or the number of parameters grows.

Example:

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]);
41
ответ дан 30 November 2019 в 23:50
поделиться

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

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

7
ответ дан 30 November 2019 в 23:50
поделиться

My spontaneous solution would look like this:

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."

I have used this kind of template replacements in several real-world projects and have never found it to be a performance issue. Since it's easy to use and understand, I have not seen any reason to change it a lot.

7
ответ дан 30 November 2019 в 23:50
поделиться

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

3
ответ дан 30 November 2019 в 23:50
поделиться

If you need a good, fast, but simple template engine, you should check out StringTemplate. For simple templates that don't require any logic or flow control in the template itself, StringTemplate is GREAT.

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

0
ответ дан 30 November 2019 в 23:50
поделиться

The fastest way to do it is with a StringBuilder using individual calls to StringBuilder.Append(), like this:

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

I've thoroughly benchmarked the framework code, and this will be fastest. If you want to improve readability you could keep a separate string to show the user, and just use this in the background.

0
ответ дан 30 November 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: