You can use Any + Contains :
var items = foo.Where(s => !filter.Any(w => s.Contains(w)));
if you want to compare case insensitive:
var items = foo.Where(s => !filter.Any(w => s.IndexOf(w, StringComparison.OrdinalIgnoreCase) >= 0));
Refresh . If you want to exclude sentences in which at least one word is in the filter list, you can use String.Split() and Enumerable.Intersect :
var items = foo.Where(sentence => !sentence.Split().Intersect(filter).Any());
Enumerable.Intersect very effective since it uses Set under the hood. more efficiently transfer a long sequence. Because of Linq, deferred execution stops at the first matching word.
(note that the “empty” Split includes other space characters, such as tab or newline)
source share