修剪弦乐并将其转换为小写的最快方法

时间:2011-03-14 19:10:01

标签: c# .net windows

我已经编写了一个处理字符串的类,我遇到了以下问题:传入的字符串可以在字符串的开头和结尾带有空格。

我需要修剪字符串中的空格并将它们转换为小写字母。到目前为止我的代码:

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

我在StringBuilder找不到任何帮助我的功能。问题是这个类应该尽可能快地处理很多字符串。所以我不想为类处理的每个字符串创建2个新字符串。

如果无法做到这一点,我将深入研究处理算法。

5 个答案:

答案 0 :(得分:15)

尝试方法链接。

前:

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

答案 1 :(得分:2)

Cyber​​drew有正确的想法。如果字符串是不可变的,那么无论如何都会在这两个调用期间分配内存。如果您要在代码中的许多位置致电string.Trim().ToLower(),我建议您使用extension methods来简化通话。例如:

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

如果字符串仅使用ASCII字符,则可以查看C# ToLower Optimization。如果您提前知道字符集,也可以尝试lookup table

答案 4 :(得分:0)

首先,首先修剪并替换第二个,所以你必须使用ToLower()

迭代一个较小的字符串

除此之外,我认为你最好的算法看起来像这样:

  • 迭代字符串一次,然后检查
    • 是否有任何大写字符
    • 是否有开头和结尾的空白(并计算你正在谈论多少个字符)
  • 如果以上都不是,则返回原始字符串
  • 如果是大写但没有空格:do ToLower并返回
  • 如果有空格:
    • 分配一个大小合适的新字符串(原始长度 - 白色字符数)
    • 在执行ToLower时填写