Maneira elegante de contar caracteres alfanuméricos em uma string?

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.