代码之家  ›  专栏  ›  技术社区  ›  AMissico

我需要一个与StringBuilder类一起工作的不区分大小写的替换方法

  •  2
  • AMissico  · 技术社区  · 16 年前

    我需要不区分大小写的代码 Replace 方法 StringBuilder 班代码应该与现有的 字符串拼接 .一个扩展方法实现就好了。

    以下是我计划如何使用该方法:

        [TestMethod]
        public void StringBuilder_Replace_TTD() {
    
            StringBuilder oRequestText = new StringBuilder(File.ReadAllText("Customer.xml"));
    
            Customer oCustomer = new Customer(null);
    
            foreach (FieldIndex iField in Enum.GetValues(typeof(FieldIndex))) {
    
                oRequestText.Replace("{" iField.ToString() + "}", oCustomer[iField]);
    
            }
    
            Debug.WriteLine(oRequestText.ToString());
        }
    
    4 回复  |  直到 15 年前
        1
  •  3
  •   LBushkin    16 年前

    StringBuilder 不支持使用 IComparer 搜索/替换文本时(实际上,根本不支持搜索)。你可以尝试一个角色一个角色的滚动,但这会很复杂,而且可能仍然表现不佳。

    根据您的用例,我建议使用字符串而不是 字符串拼接 ,并使用 string.IndexOf() 在输入字符串中定位要替换的位置,该位置支持不区分大小写的搜索。找到所有替换区域后,创建一个 字符串拼接 然后复制每个区域——用所需的替换值替换找到的文本。

    编辑:大概你想用一个 字符串拼接 以避免分配额外的字符串,并因此导致性能下降。但是,替换文本 在内部 缓冲器 字符串拼接 实际上可能更昂贵——尤其是如果替换字符串的长度与它们要替换的源字符串的长度不同。每次替换都需要根据替换文本的长度或长度向前或向后移动字符。执行这样的内存块移动将非常昂贵。

        2
  •  2
  •   NinjaCat    16 年前

    发件人: http://blogs.msdn.com/b/btine/archive/2005/03/22/400667.aspx

    string Replace( string expr, string find, string repl, bool bIgnoreCase )  
    {
    // Get input string length
           int exprLen = expr.Length;
           int findLen = find.Length;
    
           // Check inputs    
           if( 0 == exprLen || 0 == findLen || findLen > exprLen )    
                  return expr;
    
           // Use the original method if the case is required    
           if( !bIgnoreCase )
                  return expr.Replace( find, repl );
    
           StringBuilder sbRet = new StringBuilder( exprLen );
    
           int pos = 0;              
           while( pos + findLen <= exprLen )    
           {    
                  if( 0 == string.Compare( expr, pos, find, 0, findLen, bIgnoreCase ) )    
                  {    
                         // Add the replaced string    
                         sbRet.Append( repl );    
                         pos += findLen;    
                         continue;    
                  }
    
                  // Advance one character    
                  sbRet.Append( expr, pos++, 1 );    
           }
    
           // Append remaining characters    
           sbRet.Append( expr, pos, exprLen-pos );
    
           // Return string    
           return sbRet.ToString();    
    }
    
        3
  •  0
  •   user348905 user348905    16 年前

    在您的示例中,您想做(在伪代码中):

    StringBuilder oRequestText = ...;
    For all fields do replace on oRequestText;
    Debug.WriteLine(oRequestText.ToString());
    

    由于在此之后您实际上没有使用StringBuilder,因此与

    StringBuilder oRequestText = ...;
    string strRequest = oRequestText.ToString();
    For all fields do replace on strRequest;
    Debug.WriteLine(strRequest);
    

    字符串的常规替换函数应该很容易支持您想要做的事情。

    我假设在你的真实情况下,你确实想再次使用StringBuilder。但这可能仍然是最简单的方法。ToString(),替换该字符串,然后用该字符串重新加载StringBuilder。

        4
  •  0
  •   Rob Sedgwick    11 年前

    我会使用RegEx replace方法,但它意味着从StribgBuilder转换为字符串

    oRequestText = new StringBuilder(Regex.Replace(oRequestText.ToString(), "{" iField.ToString() + "}", oCustomer[iField], RegexOptions.IgnoreCase)));