如何在 .NET 中切换字符串的大小写
以下两种切换大小写算法,作为“纯” .NET 解决方案实现(没有“不安全”编码技术,全部是托管代码),经过对包含 ASCII、Unicode、全部小写、全部大写、长数字字符串等多种文本字符串的测试,展现了最佳性能。
1. Ayoola-Bell 切换大小写算法
(最初由 Henry Ayoola 发布,由 Alex Bell 修改)
//====================================================== /// <summary>Ayoola-Bell Toggle Case Algorithm</summary> /// <param name="s">string</param> /// <returns>string</returns> public static string ToggleCase_Ayoola_Bell(string s) { char[] chs = s.ToCharArray(); for (int i = s.Length - 1; i >= 0; i--) { char ch = chs[i]; if (char.IsLetter(ch)) { char foo = (char)(ch & ~0x20); if ((foo >= 0x41 && foo <= 0x5a) || (foo >= 0xc0 && foo <= 0xde && foo != 0xd7)) chs[i] = (char)(ch ^ 0x20); else if ((foo == 0xdf || ch > 0xff)) chs[i] = char.IsLower(ch) ? char.ToUpper(ch) : char.ToLower(ch); } } return (new String(chs)); } //=======================================================
上述算法是速度最快的 .NET 解决方案;它在处理文本字符串之前实现了重要的 char.IsLetter
检查,从而在转换包含大量非字母字符的字符串时,显著提升性能。
Nedel 也采用了相同的技术,从而得到了一个优雅、简单但有效的 .NET 解决方案,在性能方面略逊于第一个算法:在处理 Unicode 字符串时,差异几乎可以忽略不计。
2. Bell-Nedel 切换大小写算法
(最初由 Nedel 发布,由 Alex Bell 修改)
//******************************************************* /// <summary>Bell_Nedel Toggle Case Algorithm</summary> /// <param name="s">string</param> /// <returns>string</returns> protected string ToggleCase_Bell_Nedel(string s) { char[] charArr = s.ToCharArray(); for (int i = 0; i < charArr.Length; ++i) { if (char.IsLetter(charArr[i])) { charArr[i] = char.IsLower(charArr[i]) ? char.ToUpper(charArr[i]) : char.ToLower(charArr[i]); } } return (new String(charArr)); } //*********************************************************
注意:在性能方面,这个“非凡高效切换大小写算法联盟”中的绝对速度冠军是 Michael Hansen 提供的解决方案;请注意,他的解决方案使用了“不安全”编码技术,超出了 .NET 托管代码的边界。