在c#中,检查字符串是否有大写字母的最快方法是什么

本文关键字:大写字母 是什么 方法 是否 检查 字符串 | 更新日期: 2023-09-27 17:58:02

我的第一个实现想法是简单地执行:

bool hasUpperCase (string str) {
    if(string.IsNullOrEmpty(str))
         return false;
    for (int i = 0; i < str.Length; i++) {
        if (char.IsUpper (str[i]))
            return true;                    
    }
    return false;
}

但也许还有其他更快的方法呢?

在c#中,检查字符串是否有大写字母的最快方法是什么

您可以将其简化为

bool HasUpperCase (string str) {
    return !string.IsNullOrEmpty(str) && str.Any(c => char.IsUpper(c));
}

使用LINQ。

从这里作弊:

bool hasUpperCase (string str) {
 if(string.IsNullOrEmpty(str))
     return false;
  return str != str.ToLower();
}

好了,是时候了解新的真相了!

这是对字符串中任何大写字符的测试。

该字符串保证在前60K个字符内没有任何大写字符。(我从random.org创建了字符串)

我通过随机化传递给测试函数的64K字符串来阻止编译器中的字符串替换优化。

所有时间安排都严格围绕实际测试,不包括函数调用时间。

我进行了一次、10次和10000次测试,并对每次测试的每组时间进行了平均。

我在一台64位Win 7上运行了测试,i3-2100 CPU@3.1 Ghz

测试用例1:

   static bool testCaseOne(string str, out double ms)
    {
        bool result = false;
        DateTime start = DateTime.Now;
        result = !string.IsNullOrEmpty(str) && str.Any(c => char.IsUpper(c));
        ms = (DateTime.Now - start).TotalMilliseconds;
        return result;
    }

结果平均时间:

  1. 1 X=3.000毫秒
  2. 10 x=0.860毫秒
  3. 10000 x=0.821毫秒

测试用例2:

    static bool testCaseTwo(string str, out double ms)
    {
        bool result = false;
        DateTime start = DateTime.Now;
        if (string.IsNullOrEmpty(str))
        {
            ms = 0;
            return false;
        }
        result = Regex.IsMatch(str, "[A-Z]");
        ms = (DateTime.Now - start).TotalMilliseconds;
        return result;
    }

结果平均时间:

  1. 1 x=2.000毫秒
  2. 10 x=1.597毫秒
  3. 10000 x=1.603毫秒

测试用例3:

   static bool testCaseThree(string str, out double ms)
    {
        bool result = false;
        DateTime start = DateTime.Now;
        if (string.IsNullOrEmpty(str))
        {
            ms = 0;
            return false;
        }
        for (int i = 0; i < str.Length; i++)
        {
            if (char.IsUpper(str[i]))
            {
                result = true;
                break;
            }
        }
        ms = (DateTime.Now - start).TotalMilliseconds;
        return result;
    }

结果平均时间:

  1. 1 x=1.000毫秒
  2. 10 x=0.357毫秒
  3. 10000 x=0.298毫秒

测试用例4:

    static bool testCaseFour(string str, out double ms)
    {
        bool result = false;
        DateTime start = DateTime.Now;
        if (string.IsNullOrEmpty(str))
        {
            ms = 0;
            return false;
        }
        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] > 64 && str[i] < 91)
            {
                result = true;
                break;
            }
        }
        ms = (DateTime.Now - start).TotalMilliseconds;
        return result;
    }
}

结果平均时间:

  1. 1 x=0.000毫秒
  2. 10 x=0.137毫秒
  3. 10000 x=0.184毫秒

有趣。

我希望这能使R.K.先生得到肯定;)

bool hasUpperCase(string str) {
    if (string.IsNullOrEmpty(str))
        return false;
    return Regex.IsMatch(str, "[A-Z]");
}

免责声明:我不是Regex专家,但我用字符串Testing, testinG, and tesTing,进行了测试,结果均为true。但是,它也使用字符串TESTING计算为true,您可能需要也可能不需要。

代码对我来说很好,因为你要求性能,你可以通过从反面添加条件检查来将for循环从O(n)减少到O(n/2+~1)。

否则,您可以检查两个后续元素,并将i增加2。显然,您应该检查i<第二个参数的str.Length。

bool hasUpperCase (string str) {
if(string.IsNullOrEmpty(str))
     return false;
for (int i = 0; i < str.Length; i= i + 2) {
    if (char.IsUpper (str[i]))
        return true;                    
    if ((i + 1) < str.Length && char.IsUpper (str[i+1]))
        return true;                    
}
return false;

}

IMHO,这个提示可能有助于回答算法面试,但没有得到太多性能。

    public static string Upper_To_Lower(string text)
    {
        if (Char.IsUpper(text[0]) == true) { text = text.Replace(text[0], char.ToLower(text[0])); return text; }
        return text;
    }
    public static string Lower_To_Upper(string text)
    {
        if (Char.IsLower(text[0]) == true) { text = text.Replace(text[0], char.ToUpper(text[0])); return text; }
        return text;
    }

在这里,我做了两个简单的方法,它们检查任何字符串的第一个字母,并将其从Upper转换为Lower和virse-verca。。。。希望这对你有帮助。