2012-03-19 14 views
10

ऐसा लगता है कि IList<T> पर कई एक्सटेंशन विधियां IEnumerable<T> पर लागू होती हैं - जैसे कि FindAll और RemoveAllक्यों नहीं IENumerable <T> FindAll या निकालें सभी विधियां हैं?

क्या कोई तर्क दे सकता है कि वे वहां क्यों नहीं हैं? लेकिन वहाँ एक FindAll 3.5 के बाद से है - -

उत्तर

20

RemoveAll के बाद से वहाँ कोई Remove आदि कि एपीआई पर है कोई मतलब नहीं है, लेकिन यह Where के रूप में जाना जाता है:

IEnumerable<Foo> source = ... 
var filtered = source.Where(x => x.IsActive && x.Id = 25); 

जो के बराबर है:

IEnumerable<Foo> source = ... 
var filtered = from x in source 
       where x.IsActive && x.Id == 25 
       select x; 
+0

स्पष्टीकरण के लिए धन्यवाद, मुझे अब और अधिक तस्वीर दिखाई दे रही है, लेकिन क्या मैं 2 संबंधित प्रश्नों का पालन कर सकता हूं: (1) सूची क्यों ढूँढें FindAll के साथ-साथ कहां मानते हैं कि वे समान हैं: (2) क्यों ICollection RemoveAll लागू नहीं करता है क्योंकि यह लागू करता है निकालें? धन्यवाद एंडी – Andy

+0

@ एंडी मुझे नहीं लगता कि इसके लिए एक कारण है, लेकिन आप अपने आप को एक विस्तार विधि लिख सकते हैं, मेरा जवाब देखें। –

+0

@ एंडी 'सूची '' कहां' प्राप्त करता है क्योंकि यह 'IEnumerable ' लागू करता है।पुन :: आईसीओलेक्शन': क्योंकि इंटरफेस के लिए अतिरिक्त विधियों को जोड़ने का अच्छा विचार नहीं है, फिर भी, इंटरफ़ेस पर एक विस्तार विधि का उपयोग करके यह लागू करना पूरी तरह से संभव होगा, –

1

RemoveAll लिए IEnumerable पर लागू नहीं है क्योंकि IENumerable केवल पढ़ने के लिए है। FindAll के लिए, मार्क का जवाब देखें।

1

सभी IEnumerable यह निर्दिष्ट करता है कि एक संग्रह है जिसे समझाया जा सकता है या फिर से चालू किया जा सकता है। यह यह भी निर्दिष्ट नहीं करता है कि संग्रह को कई बार फिर से चालू किया जा सकता है, अकेले ही छेड़छाड़ कीजिए। इसलिए, संग्रह में हेरफेर करने वाली कोई भी विधि समझ में नहीं आती है। हालांकि, FindAll जैसे तरीके समझ में आएंगे।

9

गणित का मतलब यह नहीं है कि एक अंतर्निहित संग्रह है, इसलिए आप यह नहीं जान सकते कि क्या निकालने के लिए कुछ है या नहीं। यदि एक अंतर्निहित संग्रह है, तो आप नहीं जानते कि यह एक निष्कासन ऑपरेशन का समर्थन करता है या नहीं।

यहां एक उदाहरण विधि है जो विषम संख्याओं को दर्शाती है। यदि आप संख्यात्मक से 7 को "हटा" सकते हैं, तो क्या होगा? इसे कहाँ से हटाया जाएगा?

public IEnumerable<int> GetOddPositiveNumbers() 
{ 
    int i = 0; 
    while (true) 
    {   
     yield return 2*(i++)+1; 
    } 
} 

आप के लिए देख रहा हो सकता है क्या Where और Except कि आप फिल्टर गणनीय करने की अनुमति देता है।

+0

+1। – aboveyou00

1

IEnumerable<T>.RemoveAll जैसे उचित होने के लिए वास्तव में समझ में आ सकता है यदि आप वास्तव में जो चाहते हैं वह एक विशेष संग्रह का शून्य लंबाई संस्करण है। इसे RemoveAll पर कॉल करना कोई समझ नहीं आता है क्योंकि IEnumerable<T> विधि कार्यान्वयन को संग्रह को संशोधित करना चाहिए।

तो मेरे मामले में मैं कभी-कभी कस्टम एक्सटेंशन विधि का उपयोग करता हूं जिसे मैं Nil पर कॉल करता हूं।

static IEnumerable<T> Nil<T>(this IEnumerable<T> self) { 
    yield break; 
} 

FindAll के लिए के रूप में के रूप में मार्क पहले ही बताया बस Where कहा जाता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^