के साथ IENumerable प्रकारों को बाहर निकालें, मैं अपने व्युत्पन्न प्रकार के आधार पर वस्तुओं को फ़िल्टर-टू-ऑब्जेक्ट्स के साथ कैसे फ़िल्टर कर सकता हूं?linq
मैं सर्वोत्तम प्रदर्शन के साथ समाधान की तलाश में हूं।
इस्तेमाल किया कक्षाओं:
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));
क्या होगा यदि आपके पास 'मैड डक' है, जो 'डक' से प्राप्त होता है? क्या उसे वापस किया जाना चाहिए या नहीं? और, बीटीडब्ल्यू, आप क्या हासिल करने की कोशिश कर रहे हैं? 'Is' और रनटाइम प्रकार-जांच का उपयोग डिज़ाइन समस्याओं को इंगित कर सकता है। – Groo
अच्छा सवाल। इस विशिष्ट मामले में मैं डक के उप-वर्गों को भी बाहर रखा जाना चाहूंगा। इससे मेरा विकल्प 'बी' अमान्य हो जाएगा क्योंकि वे प्रकार की तुलना करते हैं लेकिन विरासत नहीं। – Aphelion
मेरे दूसरे questioin के बारे में: एक ओओपी दृष्टिकोण से, आपके कोड के अन्य हिस्सों को आमतौर पर आपकी वस्तुओं के वास्तविक प्रकार से संबंधित नहीं होना चाहिए। "जितना संभव हो उतना छोटा" पता होना चाहिए। यही कारण है कि मुझे आश्चर्य है कि आप ऐसा क्यों कर रहे हैं। – Groo