优雅的方式来计算字符串中的字母数字字符?

我正在寻找一种优雅的方式,最好是一个简短的linq表达式来计算给定字符串包含多少个字母数字字符。

我现在这样做的“无聊”方式是这样的:

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

这已经相当短了,但我确信有一些linq魔法,这可以用更短,同样可以理解的表达来完成,对吧?

这是获得字母和数字计数的快速而又脏的LINQ方式:

 password.Count(char.IsLetterOrDigit) 

这更像是你正在做的事情的直接副本:

 password.Count(c => !char.IsLetterOrDigit(c)) 
 int num = password.Where((t, i) => !char.IsLetterOrDigit(password, i)).Count(); if (num < MinRequiredNonAlphanumericCharacters) return false; 

你可以用一行Regex来做。 这是否可以理解是一个有争议的问题。

 num = new Regex(@"\w", RegexOptions.IgnoreCase).Matches(input).Count 

您可以使用Take()来确保不检查超过必要的字母:

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

我们的想法是,只有在达到最小数量后才会检查。 此时,我们可以停止,因为我们知道我们有一个可接受的密码。 Take()尽可能多地使用,而不是更多,所以如果没有足够的话,它将返回一个比你请求的数字少的数字。