Проверяет ли Linq() флажок для HashSet?

Иногда HashSet отображается через свойство как IEnumerable.

Хорошо известно, что для enumerable.Count() код проверяет, является ли он коллекцией, поэтому он не перечисляет весь список, а принимает ярлык.

Есть ли аналогичная проверка для использования версии Linq enumerable.Contains(x) и HashSets?

Ответ 1

Из справочного источника да, но это не так:

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value) {
    ICollection<TSource> collection = source as ICollection<TSource>;
    if (collection != null) return collection.Contains(value);
    return Contains<TSource>(source, value, null);
}

Если источник перечислит реализует ICollection<T>HashSet<T>), то он использует метод коллекции Contains.

Ответ 2

Обратите внимание, что документально искать ICollection<T> (см. примечания).