Несколько баллов:
- Избавиться от
Buf
; просто присвойте a.Pages[i].Text
непосредственно contain
:
inside[pair.Key]
тратит время на поиск значения, связанного с этим ключом; время потрачено впустую, потому что у вас есть намного более дешевая ссылка на этот объект в pair.Value
.
- если у вас есть список целочисленных значений, почему вы храните их как строки?
Пример кода:
for (int i = 1; i <= a.PageCount; i++)
{
String contain = a.Pages[i].Text
if (contain != "")
{
// Inside is dictionary of keys and value contain page where I found it
foreach (KeyValuePair<string, List<int>> pair in inside)
{
if (contain.Contains(pair.Key))
pair.Value.Add(i);
}
}
}
Наконец, убедитесь, что Pages
действительно использует индекс на основе одного. Коллекции чаще всего индексируются нулями.
РЕДАКТИРОВАТЬ , поскольку Pages
является словарем:
foreach (KeyValuePair<int, Page> kvp in a.Pages)
{
string contain = kvp.Value.Text;
if (contain == "")
continue;
foreach (KeyValuePair<string, List<int>> pair in inside)
if (contain.Contains(pair.Key))
pair.Value.Add(kvp.Key);
}
Сколько раз вы рассчитывали время первого примера кода? Время может варьироваться в зависимости от многих внешних факторов; тот факт, что один прогон одного подхода быстрее или медленнее, чем один прогон другого, на самом деле мало о чем говорит, тем более что предложенные мною предложения, вероятно, не решают большую часть проблемы.
Как заметил кто-то еще, главная проблема в том, что вы звоните contain.Contains(pair.Key)
350 000 раз; это, вероятно, ваше узкое место. Вы можете профилировать метод, чтобы узнать, правда ли это. Если это равно true, тогда, вероятно, лучшим вариантом будет что-то вроде алгоритма Рабина Карпа, предложенного Miserable Variable.