¿Cómo puedo filtrar objetos en función de su tipo derivado con linq-to-objects?Excluir tipos de IEnumerable con linq
Estoy buscando la solución con el mejor rendimiento.
Las clases utilizadas:
abstract class Animal { }
class Dog : Animal { }
class Cat : Animal { }
class Duck : Animal { }
class MadDuck : Duck { }
sé de tres métodos: Usar la palabra clave is
, utilice el método Except
, y utilizar el método OfType
.
List<Animal> animals = new List<Animal>
{
new Cat(),
new Dog(),
new Duck(),
new MadDuck(),
};
// Get all animals except ducks (and or their derived types)
var a = animals.Where(animal => (animal is Duck == false));
var b = animals.Except((IEnumerable<Animal>)animals.OfType<Duck>());
// Other suggestions
var c = animals.Where(animal => animal.GetType() != typeof(Duck))
// Accepted solution
var d = animals.Where(animal => !(animal is Duck));
¿Qué pasa si tienes un 'MadDuck', que hereda de un' Duck'? ¿Debería ser devuelto o no? Y, por cierto, ¿qué estás tratando de lograr? El uso de 'is' y la verificación de tipo de tiempo de ejecución pueden indicar problemas de diseño. – Groo
Buena pregunta. En este caso específico, me gustaría que también se excluyan las subclases de Pato. Eso haría inválida mi opción 'b' al comparar el tipo pero no la herencia. – Aphelion
En cuanto a mi segunda pregunta: desde el punto de vista de OOP, otras partes de tu código no deberían preocuparse por los tipos reales de tus objetos. El debería saber "lo menos posible". Es por eso que me pregunto por qué estás haciendo esto. – Groo