Jak mogę odfiltrować obiekty na podstawie ich typu pochodnego za pomocą linq-to-objects?Wyklucz typy z IEnumerable z linq
Szukam rozwiązania o najlepszej wydajności.
Klasy używane:
abstract class Animal { }
class Dog : Animal { }
class Cat : Animal { }
class Duck : Animal { }
class MadDuck : Duck { }
wiem z trzech metod: Użyj słowa kluczowego is
, użyj metody Except
i użyć metody 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));
Co, jeśli masz 'MadDuck', który dziedziczy po' Kaczce'? Czy powinien on zostać zwrócony, czy nie? A co, btw, co próbujesz osiągnąć? Użycie sprawdzania typu "is" i "runtime" może wskazywać problemy projektowe. – Groo
Dobre pytanie. W tym konkretnym przypadku chciałbym, aby wyłączono także podklasy Ducka. To spowodowałoby, że moja opcja "b" jest niepoprawna, ponieważ porównuje typ, ale nie dziedziczenie. – Aphelion
Odnośnie mojego drugiego zadania: z punktu widzenia OOP, inne części twojego kodu nie powinny zwykle zajmować się rzeczywistymi typami twoich obiektów. Powinien wiedzieć "tak mało jak to możliwe". Dlatego zastanawiam się, dlaczego to robisz. – Groo