2010-10-07 1 views
3

Я всегда считал, что достаточное требование, чтобы класс должен был удовлетворять, чтобы иметь возможность использовать Where() с ним, должен реализовать IEnumerable.Требования к классу коллекции, который будет использоваться с LINQ

Но сегодня мой друг задал мне вопрос, почему он не может применить Where() к объекту класса SPUserCollection (это от Sharepoint). Поскольку этот класс получен из SPBaseCollection, который реализует IEnumerable - я ожидал, что все будет хорошо. Но это не так.

Любые идеи, почему?

ответ

3

Методы расширения 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.

+0

О, я знал, что это что-то очевидное ;-) Спасибо. – zerkms

+0

Да, по какой-то неизвестной причине я думал, что LINQ автоматически делает для не общих коллекций. – zerkms

+0

@zerkms Да, я удивляюсь каждый раз, когда IntelliSense всплывает без методов расширения. Хорошо, что они включили «Cast» в транспортные библиотеки! –