Come posso filtrare gli oggetti in base al loro tipo derivato con linq-to-objects?Escludi tipi modulo IEnumerable con linq
Sto cercando la soluzione con le migliori prestazioni.
Le classi utilizzate:
abstract class Animal { }
class Dog : Animal { }
class Cat : Animal { }
class Duck : Animal { }
class MadDuck : Duck { }
so di tre metodi: Utilizzare la parola chiave is
, utilizzare il metodo Except
, e di utilizzare il metodo 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));
Cosa succede se si dispone di un 'MadDuck', che eredita da un' Anatra'? Dovrebbe essere restituito o no? E, btw, cosa stai cercando di ottenere? L'uso di 'is' e il controllo del tipo di runtime potrebbe indicare problemi di progettazione. – Groo
Buona domanda. In questo caso specifico vorrei che anche le sottoclassi di Duck fossero escluse. Ciò renderebbe la mia opzione 'b' non valida quando confrontano il tipo ma non l'ereditarietà. – Aphelion
Per quanto riguarda la mia seconda ricerca: da un punto di vista OOP, altre parti del codice non dovrebbero di solito riguardare i tipi reali di oggetti. Il dovrebbe sapere "il meno possibile". Ecco perché mi chiedo perché lo stai facendo. – Groo