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



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

我现在做这件事的"无聊"方式是:

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

这已经很短了,但我相信有了一些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()需要尽可能多的数字,不能再多了,所以如果没有足够的数字,它只会返回一个比您请求的少的数字。

最新更新