C # сверхбыстрый тип "mailmerge" заменить - PullRequest
1 голос
/ 26 октября 2009

Я надеюсь, что некоторые указатели помогут найти самый быстрый способ замены, когда документ, требующий замены битов, является постоянным (своего рода сценарий mailmerge).

Конечно, есть много способов сделать замены, используя string.replace и regexp, но похоже, что они должны анализировать входной документ каждый раз в поисках совпадения. Это бит, который я пытаюсь оптимизировать.

Ответы [ 3 ]

2 голосов
/ 26 октября 2009

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

Какой-то псевдокод:

doc_array = split(input_doc, "token marker")

for each replace_array in set_of_replace_arrays:
    this_doc = ""

    while elements remain in doc array:
        this_doc.concat(next doc element)

        if any elements remain in replace array:
            this_doc.concat(next replace element)

    output this_doc
0 голосов
/ 26 октября 2009

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

0 голосов
/ 26 октября 2009

Ну, так как вы не хотите анализировать, а ваш входной документ постоянен, вы можете использовать MemoryStream для обработки исходного документа и изменения битов, используя их абсолютную позицию.

Другим способом может быть использование маркеров String.Format в качестве заполнителей:

string input = "Dear {0} {1}";
//...
return String.Format(input, "Mr.", "Farias");
...