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

tom*_*cki 22 c# string

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

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;
}
Run Code Online (Sandbox Code Playgroud)

但也许还有另一种更快的方法吗?

Fem*_*ref 40

你可以减少到

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

使用LINQ.


Pet*_* K. 9

从这里作弊:

bool hasUpperCase (string str) {
 if(string.IsNullOrEmpty(str))
     return false;

  return str != str.ToLower();
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ann 5

好的 - 新的真相的时间!

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

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

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

所有时间都非常严格地围绕实际测试,并且不包括函数调用时间.

我测试了一次,10次,然后再次测试10,000次,并对每次测试的每组时间进行平均.

我使用i3-2100 CPU @ 3.1 Ghz在64位Win 7上运行测试

测试案例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;
    }
Run Code Online (Sandbox Code Playgroud)

平均时间:

  1. 1 X = 3.000 ms
  2. 10 x = 0.860 ms
  3. 10,000 x = 0.821 ms

测试案例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;
    }
Run Code Online (Sandbox Code Playgroud)

平均时间:

  1. 1 x = 2.000 ms
  2. 10 x = 1.597 ms
  3. 10,000 x = 1.603 ms

测试案例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;
    }
Run Code Online (Sandbox Code Playgroud)

平均时间:

  1. 1 x = 1.000 ms
  2. 10 x = 0.357 ms
  3. 10,000 x = 0.298 ms

测试案例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;
    }

}
Run Code Online (Sandbox Code Playgroud)

平均时间:

  1. 1 x = 0.000 ms
  2. 10 x = 0.137 ms
  3. 10,000 x = 0.184 ms

有趣.

我希望这对RK先生表示满意;)