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

时间:2012-07-19 21:58:16

标签: c# .net string linq alphanumeric

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

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

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

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

4 个答案:

答案 0 :(得分:17)

这是快速而又脏的LINQ方式来获取字母&amp;数字计数:

password.Count(char.IsLetterOrDigit)

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

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

答案 1 :(得分:2)

int num = password.Where((t, i) => !char.IsLetterOrDigit(password, i)).Count();

if (num < MinRequiredNonAlphanumericCharacters)
    return false;

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

我们的想法是,只有在达到最低数量后才会继续检查。此时,我们可以停止,因为我们知道我们有一个可接受的密码。 Take()尽可能多地使用{{1}},所以如果数量不够,它只会返回一个比您要求的数字少的数字。