首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从字符串中删除字符的最快方法

从字符串中删除字符的最快方法
EN

Stack Overflow用户
提问于 2010-02-02 15:30:43
回答 6查看 9.3K关注 0票数 24

我有一个字符串,我必须从其中删除以下字符:'\r‘、'\n’和'\t‘。我已经尝试了三种不同的方法来删除这些字符,并对它们进行了基准测试,这样我就可以获得最快的解决方案。

下面是我运行了1000000次的方法和执行时间:

如果我要删除1到2个字符,这应该是最快的解决方案。但是,随着我放入更多的char,它开始花费更多的时间

代码语言:javascript
复制
str = str.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace("\t", string.Empty);

执行时间= 1695

对于1个或2个字符,这比String.Replace慢,但对于3个字符,它表现出更好的性能。

代码语言:javascript
复制
string[] split = str.Split(new char[] { '\t', '\r', '\n' }, StringSplitOptions.None);
str = split.Aggregate<string>((str1, str2) => str1 + str2);

执行时间= 1030

最慢的,即使只有1个字符。也许我的正则表达式不是最好的。

代码语言:javascript
复制
str = Regex.Replace(str, "[\r\n\t]", string.Empty, RegexOptions.Compiled);

执行时间= 3500

这是我想出的三个解决方案。这里有没有人知道的更好更快的解决方案,或者我可以在这段代码中做的任何改进?

我用来进行基准测试的String

代码语言:javascript
复制
StringBuilder builder = new StringBuilder();
        builder.AppendFormat("{0}\r\n{1}\t\t\t\r\n{2}\t\r\n{3}\r\n{4}\t\t\r\n{5}\r\n{6}\r\n{7}\r\n{8}\r\n{9}",
         "SELECT ",
         "[Extent1].[CustomerID] AS [CustomerID], ",
         "[Extent1].[NameStyle] AS [NameStyle], ",
         "[Extent1].[Title] AS [Title], ",
           "[Extent1].[FirstName] AS [FirstName], ",
           "[Extent1].[MiddleName] AS [MiddleName], ",
           "[Extent1].[LastName] AS [LastName], ",
           "[Extent1].[Suffix] AS [Suffix], ",
           "[Extent1].[CompanyName] AS [CompanyName], ",
           "[Extent1].[SalesPerson] AS [SalesPerson], ");
        string str = builder.ToString();
EN

回答 6

Stack Overflow用户

发布于 2010-02-02 15:55:00

我相信通过将新字符串组成为char数组,并仅在完成后才将其转换为字符串,您将获得最佳性能,如下所示:

代码语言:javascript
复制
string s = "abc";
int len = s.Length;
char[] s2 = new char[len];
int i2 = 0;
for (int i = 0; i < len; i++)
{
    char c = s[i];
    if (c != '\r' && c != '\n' && c != '\t')
        s2[i2++] = c;
}
return new String(s2, 0, i2);

编辑:根据建议,使用字符串(s2,0,i2)而不是Trim()编辑

票数 10
EN

Stack Overflow用户

发布于 2010-02-02 15:45:08

代码语言:javascript
复制
String.Join(null, str.Split(new char[] { '\t', '\r', '\n' },
    StringSplitOptions.None));

由于Join()是为字符串设计的,因此与使用Aggregate()相比,性能可能会有所提高。

编辑

实际上,这可能更好:

代码语言:javascript
复制
String.Concat(str.Split(new char[] { '\t', '\r', '\n' },
    StringSplitOptions.None));
票数 6
EN

Stack Overflow用户

发布于 2010-02-02 15:36:30

循环遍历字符串并使用(只有一个) StringBuilder (带有适当的构造函数参数,以避免不必要的内存分配)来创建新字符串可能会更快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2182459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档