2012-07-19 13 views
5

Sto cercando un modo elegante, preferibilmente una breve espressione di linq, per contare quanti caratteri alfanumerici contiene una determinata stringa.Un modo elegante per contare i caratteri alfanumerici in una stringa?

Il modo 'noioso' lo faccio ora è questa:

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

Questo è piuttosto breve già, ma sono sicuro che con un po 'di magia LINQ questo può essere fatto in una, un'espressione altrettanto comprensibile anche più breve, destra?

+0

Il modo linq non si presta bene ad un'ottimizzazione molto buona, che consiste nel fermare la ricerca della stringa una volta che si hanno abbastanza caratteri alfanumerici. Va bene visto il contesto delle password e la loro lunghezza, forse non è un'ottimizzazione molto buona ... – corsiKa

+0

@corsiKa non penso che stia andando per l'ottimizzazione tanta eleganza-tizing/zucchero sintattico ... –

+0

Esatto, io sto facendo l'hashing PBKDF2 subito dopo quella parte, quindi alcuni millisecondi qui non sono comunque il problema. – magnattic

risposta

14

Qui è il modo rapido e sporco LINQ per ottenere il conteggio cifre lettera &:

password.Count(char.IsLetterOrDigit) 

Questo è più di una copia diretta di quello che stai facendo:

password.Count(c => !char.IsLetterOrDigit(c)) 
+0

Se questo funziona davvero, sarà difficile da battere in termini di lunghezza. Ben fatto, signore. – magnattic

0

Si potrebbe fare con una riga di Regex. Se questo è comprensibile è un punto controverso.

num = new Regex(@"\w", RegexOptions.IgnoreCase).Matches(input).Count 
2
int num = password.Where((t, i) => !char.IsLetterOrDigit(password, i)).Count(); 

if (num < MinRequiredNonAlphanumericCharacters) 
    return false; 
+0

Qui non è necessario, dato che puoi fare lo stesso controllo in Conteggio –

+0

@AustinSalonen come puoi vedere sono già stati mostrati vari modi in questa pagina come risposte, personalmente trovo Dove è facile da usare, è il primo metodo di estensione che arriva la mia mente – HatSoft

0

È possibile utilizzare Take() per assicurarsi di non ispezionare più lettere del necessario:

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

L'idea è che continuiamo a controllare solo dopo aver raggiunto il numero minimo. A quel punto, possiamo fermarci, perché sappiamo di avere una password ammissibile. Take() prende il maggior numero possibile e non di più, quindi se non ce ne sono abbastanza, verrà restituito un numero inferiore a quello richiesto.

Problemi correlati