Получить список записей определенного подтипа с помощью LINQ

У меня есть три класса: Foo, Bar и Baz. Bar и Baz расширяют Foo, что является абстрактным. У меня есть список типа Foo, заполненный барами и базами. Я хочу использовать предложение LINQ Where, чтобы вернуть все одного типа. Что-то вроде:

class Bar : Foo
{
  public Bar()
  {
  }
}

class Baz : Foo
{
  public Baz()
  {
  }
}

List<Foo> foos = new List<Foo>() { bar1, bar2, foo1, foo2, bar3 };
List<Bar> bars;
bars = (List<Bar>)foos.Where(o => o.GetType() == Type.GetType("Bar"));

Когда я делаю это, я получаю сообщение об ошибке: Дополнительная информация: Невозможно привести объект типа 'WhereListIterator1[Foo]' to type 'System.Collections.Generic.List1 [бар].

1 ответ

Решение

Попробуйте OfType (): отфильтровать Bar предметы и материализуйте их в список:

List<Bar> bars = foos
  .OfType<Bar>()
  .ToList();

Редактировать: если вы хотите Bar только экземпляры, но не Baz даже если / когда Baz происходит от Bar Вы должны добавить условие:

List<Bar> bars = foos
  .OfType<Bar>()
  .Where(item => item.GetType() == typeof(Bar)) // Bar only
  .ToList();
Другие вопросы по тегам