.net 我需要一个不区分大小写的Replace方法,该方法与StringBuilder类一起使用

kmb7vmvb  于 2023-04-07  发布在  .NET
关注(0)|答案(4)|浏览(123)

我需要为StringBuilder类编写一个不区分大小写的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());
    }
hpxqektj

hpxqektj1#

StringBuilder不支持在搜索/替换文本时使用IComparer(事实上,根本没有搜索支持)。您可以尝试滚动逐字符版本,但这将很复杂,并且可能仍然表现不佳。
根据你的用例,我建议使用字符串而不是StringBuilder,并使用string.IndexOf()来定位输入字符串中你要进行替换的位置-这支持大小写不敏感的搜索。一旦你找到了所有的替换区域,创建一个StringBuilder,然后复制每个区域-用所需的替换值替换找到的文本。
编辑:假设您希望使用StringBuilder替换,以避免分配额外的字符串,从而避免性能下降。替换StringBuilder的缓冲区内的文本实际上可能更昂贵-特别是如果替换字符串的长度与它们正在替换的源字符串的长度不同。每次替换都需要根据替换文本的长度或长度向前或向后移动字符。像这样执行内存块移动将是昂贵的。

up9lanfz

up9lanfz2#

From:Link

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();    
}
qxsslcnc

qxsslcnc3#

在你的例子中,你想做的(在伪代码中):

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。

tkclm6bt

tkclm6bt4#

我会使用RegExreplace方法,但这意味着将StribgBuilder转换为字符串

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

相关问题