2012-07-19 83 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()需要尽可能多的,并且不再多,所以如果没有足够的数量,它会返回比您要求的数字更少的数字。

相关问题