Игнорирование дела в Linq.Any, С#

У меня есть код, который игнорирует общие слова из пользовательского ввода:

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
 }
}

Это отлично работает, если дело не так ( "THE", поскольку пользовательский ввод не будет улавливаться "игнорируемым словом" ).

Как я могу добавить предложение IgnoreCase в сравнение Equals?

3 ответа

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

или со статическим String.Equals, который не имеет проблем с null значениями:

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


Вам нужно передать выражение лямбда:

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

Однако вы можете сделать свой код намного проще и быстрее, используя больше LINQ:

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


Как более эффективный способ сделать это:

// 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
 }
}
</string>

licensed under cc by-sa 3.0 with attribution.