Методы расширения LINQ определены для IEnumerable<T>
, а не IEnumerable
. Например, см. Подпись Where<T>
:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
Чтобы устранить эту проблему, метод расширения LINQ Cast<T>
превращает IEnumerable
в IEnumerable<T>
, который затем можно использовать с обычными функциями LINQ.
В приведенном ниже примере вы не можете сделать e.Where(...)
, но вы можете Cast
это и затем использовать Where
.
int[] xs = new[] { 1, 2, 3, 4 };
IEnumerable e = xs;
var odds = e.Cast<int>().Where(x => x % 2 == 1);
К сожалению, это нужно много использовать при работе с пре-родовыми API в .NET BCL.