Csharp/C#教程:什么是检查字符串是否在c#中具有大写字母的最快方法?分享


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

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

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

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

你可以减少到

 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次,然后再次测试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

测试案例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, "[AZ]"); 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

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

  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

有趣。

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

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

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

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

否则你可以检查两个后续元素并将i递增2.显然你应该为第二个参数检查i

 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; 

}

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

  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 ….希望这将有助于你。

上述就是C#学习教程:什么是检查字符串是否在c#中具有大写字母的最快方法?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/957064.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐