6

我正在寻找一种优雅的方式,最好是一个简短的 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

4 回答 4

18

这是获取字母和数字计数的快速而肮脏的 LINQ 方法:

password.Count(char.IsLetterOrDigit)

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

password.Count(c => !char.IsLetterOrDigit(c))
于 2012-07-19T22:03:03.070 回答
2
int num = password.Where((t, i) => !char.IsLetterOrDigit(password, i)).Count();

if (num < MinRequiredNonAlphanumericCharacters)
    return false;
于 2012-07-19T22:02:06.840 回答
0

你可以用一行正则表达式来做到这一点。这是否可以理解是一个有争议的问题。

num = new Regex(@"\w", RegexOptions.IgnoreCase).Matches(input).Count
于 2012-07-19T22:00:33.173 回答
0

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

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

我们的想法是,我们只会继续检查,直到您达到最低数量。到那时,我们可以停下来,因为我们知道我们有一个可接受的密码。Take()尽可能多地取走,没有更多,所以如果没有足够的,它只会返回一个比你请求的数字少的数字。

于 2012-07-19T22:05:54.740 回答