Eu estou procurando uma maneira elegante, de preferência uma expressão linq curta, para contar quantos caracteres alfanuméricos uma determinada string contém.
A maneira ‘chata’ que faço agora é esta:
int num = 0; for (int i = 0; i < password.Length; i++) { if (!char.IsLetterOrDigit(password, i)) { num++; } } if (num < MinRequiredNonAlphanumericCharacters) return false;
Isso já é bastante curto, mas tenho certeza que com alguma mágica linq isso pode ser feito em uma expressão ainda mais curta e igualmente compreensível, certo?
Aqui está a maneira rápida e suja de LINQ para obter a contagem de letras e dígitos:
password.Count(char.IsLetterOrDigit)
Esta é mais uma cópia direta do que você está fazendo:
password.Count(c => !char.IsLetterOrDigit(c))
int num = password.Where((t, i) => !char.IsLetterOrDigit(password, i)).Count(); if (num < MinRequiredNonAlphanumericCharacters) return false;
Você poderia fazer isso com uma linha de Regex. Se isso é compreensível é um ponto discutível.
num = new Regex(@"\w", RegexOptions.IgnoreCase).Matches(input).Count
Você pode usar Take()
para garantir que não inspecione mais letras do que o necessário:
int minCount = password.Where(x => !char.IsLetterOrDigit(x)).Take(MinRequired).Count(); if (minCount < MinRequired) { // No good }
A ideia é que só continuemos verificando até que você tenha atingido o número mínimo. Nesse ponto, podemos parar, porque sabemos que temos uma senha admissível. Take()
leva o máximo que puder, e não mais, então se não houver o suficiente, ele retornará um número menor do que o solicitado.