簡體   English   中英

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

[英]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;
    }

結果平均時間:

  1. 1 X = 3.000 毫秒
  2. 10 x = 0.860 毫秒
  3. 10,000 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. 10,000 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. 10,000 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. 10,000 x = 0.184 毫秒

有趣的。

我希望這能滿足 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM