Выбор LINQ по типу объекта
У меня есть коллекция, которая содержит два типа объектов 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 для этого? Пожалуйста, помогите мне. В противном случае мне нужно пройти через коллекцию, которую я не хочу. Спасибо.
Edit:
Спасибо всем за вашу помощь. Теперь я могу использовать OfType() из LINQ. Но я думаю, что в моем случае это не сработает. Моя ситуация
Class Container
{
List<Base> bases;
}
List<Container> containers = new List<Container>();
Теперь я хочу выбрать контейнер из контейнеров, который имеет хотя бы один тип A. Возможно, это невозможно сделать с помощью LINQ. Большое спасибо.
Ответы
Ответ 1
Вы можете использовать OfType
метод Linq для этого:
var ofTypeA = collection.OfType<A>();
Относительно вашего нежелания проходить цикл по коллекции, вы должны иметь в виду, что Linq не делает магических трюков; Я не проверял реализацию OfType
, но я был бы удивлен, если бы не нашел там цикл или итератор.
Ответ 2
Вы можете использовать метод расширения OfType для этого
IEnumerable<A> filteredToA = list.OfType<A>();
IEnumerable<B> filteredToB = list.OfType<B>();
Ответ 3
Для полноты, вот исходный код 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;
}
}
Вы можете видеть, что он лениво оценивает исходный поток.