Два варианта: Any
и All
. Какой из них использовать, зависит от того, что вы считаете более читабельным:
var allNonPq = myList.All(x => !x.StartsWith("pq"));
var notAnyPq = !myList.Any(x => x.StartsWith("pq"));
По эффективности они эквивалентны - оба остановятся, как только достигнут элемент, начинающийся с "pq", если он есть.
Если вы часто этим занимаетесь, вы можете даже написать свой собственный метод расширения:
public static bool None<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
return !source.Any(predicate);
}
в какой момент у вас будет:
var nonePq = myList.None(x => x.StartsWith("pq"));
Если вы считаете, что более удобочитаемым, чем первые два, это, конечно, личное предпочтение:)