65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 .NET 中切换字符串的大小写

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2011年2月22日

CPOL
viewsIcon

9212

以下两种切换大小写算法,作为“纯” .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 托管代码的边界。

 

 

© . All rights reserved.