Да, общий случай всегда O (n), как сказал Скливвз.
Тем не менее, многие методы LINQ имеют особый случай, когда объект, реализующий IEnumerable, фактически реализует, например, ICollection. (Я видел это для IEnumerable. Содержит по крайней мере.)
На практике это означает, что LINQ IEnumerable.Contains вызывает быстрый HashSet.Contains, например, если IEnumerable действительно является HashSet.
IEnumerable<int> mySet = new HashSet<int>();
// calls the fast HashSet.Contains because HashSet implements ICollection.
if (mySet.Contains(10)) { /* code */ }
Вы можете использовать рефлектор, чтобы точно определить, как определены методы LINQ, вот как я понял это.
О, а также LINQ содержит методы IEnumerable.ToDictionary (сопоставляет ключ с одним значением) и IEnumerable.ToLookup (сопоставляет ключ с несколькими значениями). Эта словарная / справочная таблица может создаваться один раз и использоваться многократно, что может на несколько порядков ускорить выполнение кода, интенсивно использующего LINQ.