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

Take()必要以上の文字を検査しないようにするために使用できます。

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

アイデアは、最小数に達するまでチェックを続けるということです。その時点で、許可されたパスワードを持っていることがわかっているので、停止できます。Take()可能な限り多くの数を取得しますが、それ以上は取得しません。したがって、十分でない場合は、要求した数よりも少ない数を返すだけです。

于 2012-07-19T22:05:54.740 に答える
0

1行の正規表現でそれを行うことができます。それが理解できるかどうかは論点です。

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