修整string并将其转换为小写字符的最快方法

我已经写了一个类来处理string,我有以下问题:传入的string可以在string的开始和结尾处带有空格。

我需要修剪string的空格,并将其转换为小写字母。 我的代码到目前为止:

var searchStr = wordToSearchReplacemntsFor.ToLower(); searchStr = searchStr.Trim(); 

我找不到任何function来帮助我在StringBuilder 。 问题是这个类应该尽可能快地处理大量的string。 所以我不想为每个类处理的string创build2个新的string。

如果这是不可能的,我会深入处理algorithm。

尝试方法链接。

例如:

 var s = " YoUr StRiNg".Trim().ToLower(); 

Cyber​​drew有正确的想法。 由于字符串是不可变的,所以在这两个调用中你都将分配内存。 有一件事我想建议,如果你打算在你的代码中的许多地方调用string.Trim().ToLower() ,就是用扩展方法来简化你的调用。 例如:

 public static class MyExtensions { public static string TrimAndLower(this String str) { return str.Trim().ToLower(); } } 

这是我的尝试。 但在我检查之前,我会问两个非常重要的问题。

  1. 连续的“String.Trim”和“String.ToLower”调用真的影响我的应用程序的性能? 有人会注意到,如果这个算法是两倍速度或两倍的速度? 要知道的唯一方法是衡量我的代码的性能,并与预先设定的性能目标进行比较。 否则,微观优化将产生微观性能收益。

  2. 仅仅因为我写了一个更快的实现,并不意味着它是真的。 编译器和运行时可能会对我不了解的常见操作进行优化。 我应该将我的代码的运行时间与已经存在的代码进行比较。

     static public string TrimAndLower(string str) { if (str == null) { return null; } int i = 0; int j = str.Length - 1; StringBuilder sb; while (i < str.Length) { if (Char.IsWhiteSpace(str[i])) // or say "if (str[i] == ' ')" if you only care about spaces { i++; } else { break; } } while (j > i) { if (Char.IsWhiteSpace(str[j])) // or say "if (str[j] == ' ')" if you only care about spaces { j--; } else { break; } } if (i > j) { return ""; } sb = new StringBuilder(j - i + 1); while (i <= j) { // I was originally check for IsUpper before calling ToLower, probably not needed sb.Append(Char.ToLower(str[i])); i++; } return sb.ToString(); } 

如果字符串只使用ASCII字符,则可以查看C#ToLower优化 。 如果提前知道字符集,也可以尝试查找表

所以首先,先修剪并替换第二个,所以你必须迭代一个更小的字符串与你的ToLower()

除此之外,我认为你最好的算法是这样的:

  • 迭代一次字符串,然后检查
    • 是否有任何大写字母
    • 是否有开始和结束的空白(并计算你正在谈论的字符数)
  • 如果以上都不是,则返回原始字符串
  • 如果大写,但没有空白:做ToLower并返回
  • 如果空格:
    • 分配一个正确大小的新字符串(原始长度 – 白色字符数)
    • 在做ToLower时填写它