2012-01-26 19 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; 
     } 

使用:私はドットトレースを使用していますが、この方法は、私のCPUの33%を使用しドットトレースし、最適化する方法

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

。どのように私はそれを最適化できますか?私のアプリケーションがクラッシュしたり、メモリが足りなくなったりします。このメソッドが静的であることは賢明ですか?

ドットトレースが、この上のCPUの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私はしましたが、正規表現では非常に悪いので、indexofでコードを書くのは悪い考えでした... – senzacionale

+0

dotraceは、 'System.String.IndexOf(String、Int32、Int32、あなたが単にGetStringInBetweenの呼び出しを減らすことができる場合 –

答えて

1

文字列の一部(最初のSubString呼び出し)を検索するだけで、パフォーマンスが低下します。代わりに、元の入力文字列を保持しますが、開始インデックスを取る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を解析することをお勧めします.LINQ to XMLまたはXPath型構文を使用して、結果を簡単に問い合わせる方法で公開します。これは、高速かつ効率的なライブラリです。

+0

私のコードをリファクタリングする方法の例を挙げることができますか? – senzacionale

関連する問題