[英]what is the fastest way to check whether string has uppercase letter in 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 字符串传递给测试 function 来阻止编译器中的字符串替换优化。
所有时序都非常严格地围绕实际测试,不包括 function 调用时间。
我运行了一次、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;
}
结果平均时间:
测试用例 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;
}
结果平均时间:
测试用例 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;
}
结果平均时间:
测试用例 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;
}
}
结果平均时间:
有趣的。
我希望这能满足 R 先生的要求。 K. ;)
bool hasUpperCase(string str) {
if (string.IsNullOrEmpty(str))
return false;
return Regex.IsMatch(str, "[A-Z]");
}
免责声明:我不是正则表达式专家,但我使用字符串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;
}
恕我直言,这个技巧可能有助于回答算法面试,并没有得到太多的表现。
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;
}
在这里,我做了 2 个简单的方法来检查任何字符串的第一个字母并将其从 Upper 转换为 Lower 和 virse verca.... 希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.