linq-to-objectsの派生型に基づいてオブジェクトをフィルタリングするにはどうすればよいですか?linqを使用したIEnumerableタイプの除外
私は最高のパフォーマンスで解決策を探しています。
使用されるクラス:
abstract class Animal { }
class Dog : Animal { }
class Cat : Animal { }
class Duck : Animal { }
class MadDuck : Duck { }
私は三つの方法を知っている:、is
キーワードを使用Except
メソッドを使用して、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));
'Duck'を継承する' MadDuck'があればどうでしょうか?返されるべきかどうか?そして、btw、あなたは何を達成しようとしていますか? 'is'とランタイム型チェックの使用は設計上の問題を示しているかもしれません。 – Groo
良い質問があります。この特定のケースでは、私はDuckのサブクラスも除外したいと思います。それは、型を比較するが、継承を比較しないので、私のオプション 'b'を無効にします。 – Aphelion
私の2番目の質問について:OOPの観点からは、コードの他の部分は通常、実際のオブジェクトの種類に関係するべきではありません。その人は「可能な限り」知っていなければなりません。だから私はなぜあなたがこれをやっているのだろうかと思います。 – Groo