替换字符串中文本的最佳方法

时间:2015-07-20 15:15:30

标签: c#

寻找更好的算法/技术来替换字符串变量中的字符串。我必须遍历未知数量的数据库记录,对于每一个,我需要替换字符串变量中的一些文本。现在它看起来像这样,但必须有一个更好的方法:

<system.webServer>   
  <security> 
    <ipSecurity allowUnlisted="false" denyAction="NotFound"> 
      <add allowed="true" ipAddress="192.168.1.0" subnetMask="255.255.255.0"/> 
    </ipSecurity> 
  </security>    
</system.webServer> 

根据我的理解,这并不好,因为我在循环中反复编写targetText变量。但是,我不确定如何找到和替换结构...

感谢任何反馈。

3 个答案:

答案 0 :(得分:4)

  

必须有更好的方法

字符串是不可变的 - 你不能“改变”它们 - 你所能做的就是创建一个 new 字符串并替换变量值(这并不像你想象的那么糟糕)。您可以尝试使用StringBuilder作为其他建议,但并非100%保证可以提高您的效果。

可以更改你的算法以循环浏览targetText中的“字词”,查看parameters中是否匹配,取“替换”值并建立起来一个新的字符串,但我怀疑额外的查找将比多次重新创建字符串值花费更多。

无论如何,应该考虑两个重要的绩效改进原则:

  • 首先从应用程序的最慢部分开始 - 您可能会看到一些改进,但如果它没有显着提高整体性能,那么这并不重要
  • 了解特定变化是否会改善您的表现(以及变化多少)的唯一方法是尝试两种方式并进行衡量。

答案 1 :(得分:0)

StringBuilder将具有更少的内存开销和更好的性能,尤其是在大型字符串上。 String.Replace() vs. StringBuilder.Replace()

using (eds ctx = new eds())
{
    string targetText = "This is a sample string with words that will get replaced based on data pulled from the database";

    var builder = new StringBuilder(targetText);

    List<parameter> lstParameters = ctx.ciParameters.ToList();
    foreach (parameter in lstParameters)
    {
        string searchKey = parameter.searchKey;
        string newValue = parameter.value;
        targetText = builder.Replace(searchKey, newValue);
    }
}

答案 2 :(得分:0)

实际上,假设您正在进行大量替换, 是一个更好的答案。您可以使用StringBuilder。如您所知,字符串是不可变的。正如你所说,你在循环中一遍又一遍地创建字符串。

如果您将字符串转换为StringBuilder

StringBuilder s = new StringBuilder(s, s.Length*2); // Adjust the capacity based on how much bigger you think the string will get due to replacements. The more accurate your estimate, the better this will perform.

  foreach (parameter in lstParameters)
    {
        s.Replace(parameter.searchKey, parameter.value);
    }
  string targetString = s.ToString();

现在需要注意的是,如果您的列表中只有2-3个项目,这可能不会更好。 this question的答案可以很好地分析您期望看到的性能改进。