当前位置: 首页 > 科技观察

在.NET中删除空格字符串的十大方法_0

时间:2023-03-15 22:30:46 科技观察

有无数种方法可用于从字符串中删除所有空格,但哪种方法更快?简介我们有无数种方法可用于删除字符串中的所有空格。大多数都适用于绝大多数用例,但在一些时间敏感的应用程序中,是否使用最快的方法可能会产生很大的不同。如果你问什么是空白,那有点乱。许多人将空白视为SPACE字符(UnicodeU+0020、ASCII32、HTML),但它实际上包括所有在布局中导致水平和垂直空间的字符。实际上,这是定义为Unicode字符数据库的一整类字符。本文所说的空白,不仅是指它的正确定义,还包括string.Replace("","")方法。这里的基线方法将删除所有前导、尾随和中间空格。这就是文章标题中“全是空白”的意思。背景这篇文章是出于好奇而开始的。事实上,我不需要最快的算法来从字符串中删除空格。检查空格检查空格很简单。您只需要:charwp='';chara='a';Assert.True(char.IsWhiteSpace(wp));Assert.False(char.IsWhiteSpace(a));然而,当我实施手动优化删除方法时,我意识到这并没有达到预期的效果。通过挖掘Microsoft参考源代码存储库中的char.cs找到了一些源代码:publicstaticboolIsWhiteSpace(charc){if(IsLatin1(c)){return(IsWhiteSpaceLatin1(c));}returnCharUnicodeInfo.IsWhiteSpace(c);}thenCharUnicodeInfo.IsWhiteSpace变为:internalstaticboolIsWhiteSpace(charc){UnicodeCategoryuc=GetUnicodeCategory(c);//在Unicode3.0中,U+2028istheonlycharacterwhichisunderthecategory"LineSeparator".//而U+2029istheonlycharacterwhichisunderthecateUnigory"ParagraphSeucator:Cparase"cparase()case(UnicodeLCategoparry.(UnicodeCategory.ParagraphSeparator):return(true);}return(false);}GetUnicodeCategory()方法调用InternalGetUnicodeCategory()方法,实际上速度非常快,但是现在我们有4个方法依次调用!以下代码由评论者提供,可用于快速实现自定义版本和JIT默认内联://whitespacedetectionmethod:veryfast,alotfasterthanChar.IsWhiteSpace[MethodImpl(MethodImplOptions.AggressiveInlining)]//ifit'snotinlinedthenitwillbeslow!!!publicstaticboolisWhiteSpace(charch){//这比等效的if语句switch(ch){case'\u0009':case'\u000A':case'\u000B':case'\u000C':case'\u000D':case'\u0020':case'\u0085':case'\u00A0':case'\u1680':case'\u2000':case'\u2001':case'\u2002':case'\u2003':case'\u2004':case'\u2005':case'\u2006':case'\u2007':case'\u2008':case'\u2009':case'\u200A':case'\u2028':case'\u2029':case'\u202F':case'\u205F':case'\u3000':returntrue;default:returnfalse;}}删除字符串的不同方法我使用了多种方法来删除字符串中的所有空格Separate和mergeThis是我一直使用的一种非常简单的方法。根据空白字符拆分字符串,但不包括空值,并将生成的片段重新连接在一起。这个方法听起来有点傻,但实际上,乍一看,这是一个非常浪费的解决方案:publicstaticstringTrimAllWithSplitAndJoin(stringstr){returnstring.Concat(str.Split(default(string[]),StringSplitOptions.RemoveEmptyEntries));}LINQ这是以声明方式执行此操作的优雅方式:publicstaticstringTrimAllWithLinq(stringstr){returnnewstring(str.Where(c=>!isWhiteSpace(c)).ToArray());}regexregexregex是一种非常强大的力量,任何程序员都应该意识到这一点。staticRegexwhitespace=newRegex(@"\s+",RegexOptions.Compiled);publicstaticstringTrimAllWithRegex(stringstr){returnwhitespace.Replace(str,"");}字符数组就地转换方法该方法将输入字符串转换为字符数组,然后就地扫描字符串以去除空白字符(无中间缓冲区或创建字符串)。***,“截断”的数组将生成一个新的字符串。publicstaticstringTrimAllWithInplaceCharArray(stringstr){varlen=str.Length;varsrc=str.ToCharArray();intdstIdx=0;for(inti=0;i