Что такое хороший и хороший способ производительности для обработки строки

У меня есть строка в таком формате:<b>*GTPersonnel</b><table border=1><tr><td>&#115;&#115;&#50;&#49;&#49;&#49;</td></tr></table>

Я хочу обработать те данные, которые между <td> теги и заменить каждое вхождение &#Blah; с его равным характером так, например, в &#115; Я хочу, чтобы его заменил только персонаж a так как 115 это код символа для этого.

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

2 ответа

Решение

Если вы используете XHTML Вы можете просто изменить EntityHandling недвижимость в XmlTextReader объект, чтобы сказать ему обрабатывать символьные объекты автоматически:

XmlTextReader reader = new XmlTextReader( "temp.xml" );
reader.EntityHandling = EntityHandling.ExpandCharEntities;

Тогда вы можете прочитать ваш файл с XmlTextReader или с помощью LINQ to XML, Например, если у вас есть XML-файл, подобный этому:

<?xml version="1.0" encoding="utf-8" ?>
<document>
    <td>&#115;&#115;&#50;&#49;&#49;&#49;</td>
</document>

И вы пишете код ниже и следующую пару строк:

while ( reader.Read() )
    if ( reader.NodeType == XmlNodeType.Text )
        Console.WriteLine( reader.Value );

Ты получаешь ss2111 значение в вашем окне консоли.

Высокопроизводительным, достаточно простым способом было бы установить построитель параллельных строк (инициализировать его длину так же, как оригинал) и продолжать добавлять к нему с первого раза последовательные вызовы IndexOf("#") и соответствующие преобразования. Таким образом, вы не делаете никаких вставок или удалений, вы не изменяете размер массива поддержки строителя строк (кроме как в конце), и вы читаете первую строку только вперед. LINQifying это возможно с Aggregate(), но будет больше проблем, чем стоит, и, вероятно, менее ясно.

Другие вопросы по тегам