Выбор LINQ по типу объекта - PullRequest
       1

Выбор LINQ по типу объекта

39 голосов
/ 02 октября 2010

У меня есть коллекция, которая содержит два типа объектов A и B.

Class Base{}
Class A : Base {}
Class B : Base {}

List<Base> collection = new List<Base>();
collection.Add(new A());
collection.Add(new B());
collection.Add(new A());
collection.Add(new A());
collection.Add(new B());

Теперь я хочу выбрать объекты из коллекции на основе ее типа (A или B, а не оба).

Как мне написать запрос LINQ для этого?Пожалуйста, помогите мне.В противном случае мне нужно перебрать коллекцию, которую я не хочу.Спасибо.

Редактировать:

Спасибо всем за помощь.Теперь я могу использовать OfType () из LINQ.Но я думаю, что в моем случае это не сработает.Моя ситуация

Class Container
{
  List<Base> bases;
}

List<Container> containers = new List<Container>();

Теперь я хочу выбрать контейнер из контейнеров, который имеет хотя бы один тип A. Может быть, это не может быть сделано LINQ.Большое спасибо.

Ответы [ 3 ]

83 голосов
/ 02 октября 2010

Для этого можно использовать метод OfType Linq:

var ofTypeA = collection.OfType<A>();

Что касается вашего нежелания зацикливаться на коллекции, вы должны иметь в виду, что Linq не делает фокусов; Я не проверял реализацию OfType, но я был бы удивлен , а не , чтобы найти там цикл или итератор.

11 голосов
/ 02 октября 2010

Вы можете использовать метод расширения OfType для этого

IEnumerable<A> filteredToA = list.OfType<A>();
IEnumerable<B> filteredToB = list.OfType<B>();
10 голосов
/ 02 октября 2010

Для полноты вот исходный код Enumerable.OfType<T>.

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) {
    if (source == null) throw Error.ArgumentNull("source"); 
    return OfTypeIterator<TResult>(source); 
}

static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source) {
    foreach (object obj in source) {
        if (obj is TResult) yield return (TResult)obj;
    } 
}

Вы можете видеть, что он лениво оценивает исходный поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...