Требования к классу коллекции для использования с LINQ - PullRequest
3 голосов
/ 07 октября 2010

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

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

Есть идеи, почему?

1 Ответ

3 голосов
/ 07 октября 2010

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

...