2012-01-26 3 views
0
public static string[] GetStringInBetween(string strBegin, string strEnd, string strSource, bool includeBegin, bool includeEnd) 
     { 
      string[] result = { "", "" }; 
      int iIndexOfBegin = strSource.IndexOf(strBegin); 

      if (iIndexOfBegin != -1) 
      { 
       // include the Begin string if desired 
       if (includeBegin) 
        iIndexOfBegin -= strBegin.Length; 

       strSource = strSource.Substring(iIndexOfBegin + strBegin.Length); 
       int iEnd = strSource.IndexOf(strEnd); 

       if (iEnd != -1) 
       { 
        // include the End string if desired 
        if (includeEnd) 
         iEnd += strEnd.Length; 

        result[0] = strSource.Substring(0, iEnd); 

        // advance beyond this segment 
        if (iEnd + strEnd.Length < strSource.Length) 
         result[1] = strSource.Substring(iEnd + strEnd.Length); 
       } 
      } 

      return result; 
     } 

использование:dottrace и метод оптимизации с IndexOf

string[] result = null; 
result = HtmlHelper.GetStringInBetween(bits[0], bits[1], tagValuePair.Value, true, true); 

я использую dottrace и этот метод используют 33% моего процессора. Как я могу его оптимизировать. Постарайтесь, чтобы моя ошибка приложения или я потерял память. Умеет ли этот метод статично?

dottrace показать 30% использование процессора на это:

System.String.IndexOf(String, Int32, Int32, StringComparison) 

enter image description here

EDIT:

GetStringInBetween(string strBegin, string strEnd, string strSource, bool includeBegin, bool includeEnd) 

strBegin = "<td class=\"m92_t_col2\">" 
strEnd = "</td>" 
strSource = "xxxxxxxx<td class=\"m92_t_col2\">Di. 31.01.12</td>xxxxxxxxxxxxxx 
includeBegin = true 
includeEnd = true 

then i will get result 
result[0] = "<td class=\"m92_t_col2\">Di. 31.01.12</td>" 

надеюсь, что это помогает то, что этот метод делать. Попробуйте найти строку между strBegin и strEnd ...

+1

Рассматривали вы с помощью регулярного выражения для этого? – Oded

+0

@Oded я сделал, но я очень плохо с регулярным выражением, поэтому я пишу код с индексом, который я вижу сейчас, была плохая идея ... – senzacionale

+0

Означает ли dottrace, что вызовы 'System.String.IndexOf (String, Int32, Int32, StringComparison) 'исходит из' GetStringInBetween'. Если вы можете просто уменьшить количество вызовов до 'GetStringInBetween' –

ответ

1

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

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

Что-то вдоль линий

public static string[] GetStringInBetween(string strBegin, string strEnd, string strSource, bool includeBegin, bool includeEnd) 
{ 
    string[] result = { "", "" }; 
    int iIndexOfBegin = strSource.IndexOf(strBegin, StringComparison.Ordinal); 

    if (iIndexOfBegin != -1) 
    { 
     int iEnd = strSource.IndexOf(strEnd, iIndexOfBegin, StringComparison.Ordinal); 

     if (iEnd != -1) 
     { 
      result[0] = strSource.Substring(
       iIndexOfBegin + (includeBegin ? 0 : strBegin.Length), 
       iEnd + (includeEnd ? strEnd.Length : 0) - iIndexOfBegin); 

      // advance beyond this segment 
      if (iEnd + strEnd.Length < strSource.Length) 
       result[1] = strSource.Substring(iEnd + strEnd.Length); 
     } 
    } 

    return result; 
} 
+0

Можете ли вы привести пример, как отредактировать мой код? – senzacionale

+0

Мне придется опубликовать другой ответ, так как здесь не хватает места. о, подождите - я могу отредактировать. –

0

Для вашего примера ввода, похоже, вы работаете с фрагментами HTML.

Я предлагаю использовать HTML Agility Pack для синтаксического разбора HTML-кода - он предоставляет результат в простой форме запроса, используя LINQ to XML или синтаксис типа XPath. Это быстрая и эффективная библиотека.

+0

Можете ли вы привести пример, как отредактировать мой код? – senzacionale

Смежные вопросы