出于好奇 - 是否有更好的表现方法来做这个字符串替换?

时间:2011-02-08 12:19:55

标签: c# .net string .net-3.5 c#-3.0

我有以下方法,我需要检查一些可能在任何情况下的某些字符串,然后删除它们。只是想知道是否有更好的表现方式?

private void MyMethod(string Filter)
{
   //need to remove <Filter> and </Filter> case in-sensitive
   var result = Filter.ToLower().Replace("<filter>","");
   result = Filter.ToLower().Replace("</filter>,"");

  ...........................
}

6 个答案:

答案 0 :(得分:4)

检查此答案:Is there an alternative to string.Replace that is case-insensitive?

您可能希望与性能检查进行比较。使用分析器对此进行配置。这是真正了解什么,更快的唯一方法。

但老实说:性能真的重要吗?你经常这样做吗?我不能真的看到你经常这样做,表演将成为一个问题......

您可以尝试使用不区分大小写的替换Regex.Replace。这不是更快。但它不区分大小写。

答案 1 :(得分:3)

这种方法的一个问题是它会将整个字符串变成小写字母,而不仅仅是一个用于替换的情况。

您可以使用正则表达式进行大小写匹配:

string result = Regex.Replace(
  Filter,
  "</?filter>",
  String.Empty,
  RegexOptions.IgnoreCase
);

另一个替代方法是使用IndexOf方法来定位字符串,因为它可以进行单例搜索:

string result = Filter;
int index;
while ((index = IndexOf("<filter>", StringComparison.OrdinalIgnoreCase)) != -1) {
   result = result.Remove(index, 8);
}
while ((index = IndexOf("</filter>", StringComparison.OrdinalIgnoreCase)) != -1) {
   result = result.Remove(index, 9);
}

答案 2 :(得分:1)

Replace调用在C ++中实现的非托管代码,我认为这将很难被击败。

但是,我可以看到你继续使用.ToLower(),你可以减少一个电话并保留字符串。

答案 3 :(得分:1)

在任何情况下,你都在这里对原始字符串进行下限,这可能不是一件好事吗?

答案 4 :(得分:1)

这取决于一些事情,滤波器串等多长时间 所以你必须衡量。

但是我希望这里的(单个!)RegEx更快。

答案 5 :(得分:0)

如果提供的代码适合您,则会更快:

private void MyMethod(string Filter)
{
   //need to remove <Filter> and </Filter> case in-sensitive
   var result = Filter.ToLower().Replace("</filter>","");

  ...........................
}

因为第一个语句的结果被忽略了。