2012-07-19 146 views
5

我正在尋找一個優雅的方式,最好是一個短linq表達式來計算給定字符串包含多少個字母數字字符。優雅的方法來計算字符串中的字母數字字符?

的「無聊」的方式我現在做的是這樣的:

int num = 0; 
for (int i = 0; i < password.Length; i++) 
{ 
    if (!char.IsLetterOrDigit(password, i)) 
    { 
     num++; 
    } 
} 
if (num < MinRequiredNonAlphanumericCharacters) 
    return false; 

這是相當短的了,但我相信有一些LINQ魔術這可以在更短的,同樣可以理解的表達來完成,對?

+0

linq方式不適合一個很好的優化,即一旦有足夠的字母數字字符就停止搜索字符串。好吧,考慮到密碼及其長度的上下文,也許這不是一個'非常好'的優化... – corsiKa 2012-07-19 22:01:04

+0

@corsiKa我不認爲他會優化如此多的優化/語法糖... – 2012-07-19 22:05:10

+0

這是正確的,我我正在做那個部分之後的PBKDF2哈希,所以這裏幾毫秒不是問題。 – magnattic 2012-07-19 22:08:43

回答

14

這裏的快速和骯髒的LINQ的方式來獲得信&位計數:

password.Count(char.IsLetterOrDigit) 

這更多的是,你在做什麼,直接複製:

password.Count(c => !char.IsLetterOrDigit(c)) 
+0

如果這真的起作用,就長度而言難以擊敗。幹得好,先生。 – magnattic 2012-07-19 22:05:45

0

你可以用一行正則表達式來完成。這是否可以理解是一個有爭議的問題。

num = new Regex(@"\w", RegexOptions.IgnoreCase).Matches(input).Count 
2
int num = password.Where((t, i) => !char.IsLetterOrDigit(password, i)).Count(); 

if (num < MinRequiredNonAlphanumericCharacters) 
    return false; 
+0

在這裏不必要的地方,因爲你可以做同樣的檢查計數 – 2012-07-19 22:10:23

+0

@AustinSalonen,你可以看到各種方式已經顯示在這個頁面上作爲答案,我個人發現哪裏易於使用,它的第一個擴展方法進來我的想法 – HatSoft 2012-07-19 22:13:18

0

您可以使用Take()以確保您不會檢查超過必要的字母:

int minCount = password.Where(x => !char.IsLetterOrDigit(x)).Take(MinRequired).Count(); 
if (minCount < MinRequired) { // No good } 

的想法是,我們只有繼續檢查,直到你打的最低數量。此時,我們可以停止,因爲我們知道我們有一個可接受的密碼。 Take()需要儘可能多的,並且不再多,所以如果沒有足夠的數量,它會返回比您要求的數字更少的數字。

相關問題