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

时间:2011-06-01 01:16:56

标签: 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;
}

但也许有另一种更快的方法可以做到这一点?

6 个答案:

答案 0 :(得分:40)

您可以将其减少到

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

使用LINQ。

答案 1 :(得分:9)

Cheating from here:

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

  return str != str.ToLower();
}

答案 2 :(得分: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;
    }

平均时间:

  1. 1 X = 3.000 ms
  2. 10 x = 0.860 ms
  3. 10,000 x = 0.821 ms
  4. 测试案例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 ms
    2. 10 x = 1.597 ms
    3. 10,000 x = 1.603 ms
    4. 测试案例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 ms
      2. 10 x = 0.357 ms
      3. 10,000 x = 0.298 ms
      4. 测试案例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 ms
        2. 10 x = 0.137 ms
        3. 10,000 x = 0.184 ms
        4. 有趣。

          我希望这对R. K.先生表示满意;)

答案 3 :(得分:3)

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

免责声明:我不是正则表达式专家,但我使用字符串Testing, testinG, and tesTing,测试了这一点,所有字符串都评估为true。但是,它也会使用您可能想要或不想要的字符串TESTING来评估为真。

答案 4 :(得分:2)

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

否则你可以检查两个后续元素并将i递增2.显然你应该检查i&lt; 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;

}

恕我直言,这个提示可能有助于回答算法访谈,但没有太多表现。

答案 5 :(得分:0)

    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;
    }

在这里,我制作了两个简单的方法来检查任何字符串的第一个字母并将其从上到下转换为virse verca ....希望这对你有帮助。