我已经编写了一个处理字符串的类,我遇到了以下问题:传入的字符串可以在字符串的开头和结尾带有空格。
我需要修剪字符串中的空格并将它们转换为小写字母。到目前为止我的代码:
var searchStr = wordToSearchReplacemntsFor.ToLower();
searchStr = searchStr.Trim();
我在StringBuilder
找不到任何帮助我的功能。问题是这个类应该尽可能快地处理很多字符串。所以我不想为类处理的每个字符串创建2个新字符串。
如果无法做到这一点,我将深入研究处理算法。
答案 0 :(得分:15)
尝试方法链接。
前:
var s = " YoUr StRiNg".Trim().ToLower();
答案 1 :(得分:2)
Cyberdrew有正确的想法。如果字符串是不可变的,那么无论如何都会在这两个调用期间分配内存。如果您要在代码中的许多位置致电string.Trim().ToLower()
,我建议您使用extension methods来简化通话。例如:
public static class MyExtensions
{
public static string TrimAndLower(this String str)
{
return str.Trim().ToLower();
}
}
答案 2 :(得分:2)
这是我的尝试。但在我查看之前,我会问两个非常重要的问题。
顺序“String.Trim”和“String.ToLower”调用是否真的影响了我的应用程序的性能?有人会注意到这个算法是慢两倍还是快两倍?要知道的唯一方法是 衡量 我的代码的性能,并与预先设定的效果目标进行比较。否则,微优化将产生微观性能增益。
仅仅因为我写了一个看起来更快的实现,并不意味着它确实存在。编译器和运行时可能会围绕我不了解的常见操作进行优化。我应该将我的代码的运行时间与已经存在的代码进行比较。
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();
}
答案 3 :(得分:1)
如果字符串仅使用ASCII字符,则可以查看C# ToLower Optimization。如果您提前知道字符集,也可以尝试lookup table
答案 4 :(得分:0)
首先,首先修剪并替换第二个,所以你必须使用ToLower()
迭代一个较小的字符串除此之外,我认为你最好的算法看起来像这样: