2015-04-20 18 views
8

Ho codice che ignora le parole comuni da input da parte dell'utente:caso in Linq.Any Ignorando, C#

string[] ignored_words = { "the", "and", "I" }; 

String[] words = UserInput.Split(' '); 
foreach (string word in words) 
{ 
    if (!ignored_words.Any(word.Equals)) 
    { 
     // perform actions on desired words only 
    } 
} 

Questa grande opera, a meno che il caso è sbagliato ("IL" come input utente non saranno catturati dalla "la" parola ignorata).

Come è possibile aggiungere uno IgnoreCase clause al confronto Equals?

risposta

15
if (!ignored_words.Any(w => w.Equals(word, StringComparison.CurrentCultureIgnoreCase))) 
{ 
    // ... 
} 

o con l'statica String.Equals che non ha problemi con null valori:

if (!ignored_words.Any(w => string.Equals(w, word, StringComparison.CurrentCultureIgnoreCase))) 
{ 
    // ... 
} 
7

È necessario passare un'espressione lambda:

ignored_words.Any(w => word.Equals(w, StringComparison.OrdinalIgnoreCase) 

Tuttavia, è possibile rendere il codice più più semplice e più veloce utilizzando più LINQ:

foreach (string word in words.Except(ignored_words, StringComparer.OrdinalIgnoreCase)) 
6

Come un modo più efficiente di farlo:

// note: the exact comparer deserves some thought; cultural? ordinal? invariant? 
var ignored_words = new HashSet<string>(StringComparer.CurrentCultureIgnoreCase) 
{ 
    "the", "and", "I" 
}; 

foreach (string word in words) 
{ 
    if (!ignored_words.Contains(word)) 
    { 
     // perform actions on desired words only 
    } 
} 
+0

in realtà ho provato ad utilizzare Contiene, ma raccolse parole ignorate all'interno delle parole. Ad esempio, il respiro verrebbe ignorato perché conteneva "il". –

+3

@TravisHeeter no, non è lo stesso 'Contains'; quello che stai descrivendo è 'string.Contains'; Sto usando 'HashSet .Contains' - funziona in modo completamente diverso: funzionerebbe correttamente –

Problemi correlati