У меня есть две версии селектора LINQ, который выполняет некоторую фильтрацию неуниверсальных типов и возвращает универсальное перечисление.Предположим, что мы полностью перечислим оба с одним и тем же параметром source
, интересно, какая версия будет более производительной:
public static IEnumerable<ICollection<TData>> OfType1<TData>(this IEnumerable<ICollection> source) =>
source
.Select(c => c as ICollection<TData>)
.Where(c => !(c is null));
public static IEnumerable<ICollection<TData>> OfType2<TData>(this IEnumerable<ICollection> source) =>
source
.Where(c => c is ICollection<TData>)
.Select(c => c as ICollection<TData>);
На мой взгляд, все сводится к разнице между is
и as
поскольку в OfType2
мы фильтруем первый (не последний) и, следовательно, можем сделать меньше второго оператора.В первом случае нам нужно выполнить обе операции над всеми элементами перечисляемого.
Так что же на самом деле лучше всего работает здесь?А чем отличаются is
и as
под капотом?(Ссылки на исходный код приветствуются!)