2010-05-14 1 views
7

ऑफटाइप() कैसे काम करता है?ऑफ़टाइप <T>() कार्य कैसे करता है?

मैंने this link पढ़ा है कि क्या हो रहा है, लेकिन LINQ प्रदाता वास्तव में निर्दिष्ट प्रकार से मेल खाने वाली सभी वस्तुओं को कैसे प्राप्त करता है। मुझे IQueryable<T> अनुरोधों को "चेन" पता है और फिर GetEnumerator() कहलाता है (दाएं?) का मूल्यांकन करता है।

विशेष रूप से मैं जानना चाहता हूं कि ढांचा कैसे तुलनात्मक रूप से तुलना करता है?

public IEnumerable<TResult> OfType<TResult>() 
     where TResult : class 
    { 
     foreach (TItem item in this.InnerList) 
     { 
      TResult matchItem = item as TResult; 

      if (matchItem != null) 
      { 
       yield return matchItem; 
      } 
     } 
    } 

यह सबसे अच्छा कार्यान्वयन है: मैं एक .NET 2.0 परियोजना है कि (2.0 के बाद से सुविधाओं के इस तरह का समर्थन नहीं करता) इस तरह से चला गया में एक विधि लिखा?

संपादित करें: इस OfType<T>() के साथ मेरी मुख्य चिंता यह है कि यह तेज है।

उत्तर

10

आपका वर्तमान कार्यान्वयन - डिज़ाइन द्वारा - मूल्य-प्रकार का समर्थन नहीं करता है।

public IEnumerable<TResult> OfType<TResult>(IEnumerable source) 
{ 
    foreach (object item in source) 
    { 
     if (item is TResult) 
      yield return (TResult)item; 
    } 
} 
+0

तो यह 'is' का उपयोग करना तेज़ है और फिर मूल्य प्रकारों को शामिल करने के कारण यह कास्ट किया गया है या नहीं? मैंने सोचा कि के रूप में उपयोग करना और फिर शून्य की जांच करना तेज है? – TheCloudlessSky

+0

यह संभव है कि अंतर विशिष्ट संकलक अनुकूलन के कारण अप्रासंगिक है। –

+0

@TheCloudlessSky: यदि विधि केवल रेफरी प्रकारों से निपटने के लिए बाध्य थी, तो मैं पहले से ही कर चुके 'as'/test-for-null संयोजन का उपयोग करूंगा। 'Is'/cast और' as'/test-for-null का उपयोग करने के बीच गति अंतर नगण्य होगा, लेकिन यदि माइक्रो-ऑप्टिमाइज़ेशन का स्तर आपके लिए महत्वपूर्ण है तो मेरा सुझाव है कि आप कुछ बेंचमार्किंग करें। – LukeH

0

यह मेरे लिए एक अच्छा कार्यान्वयन जैसा दिखता है, लेकिन ऐसा लगता है कि यह कार्यान्वयन विशिष्ट है (आप इसका जिक्र कर रहे हैं। इनरलिस्ट)। यदि आपने एक एक्सटेंशन विधि बनाई है (जो कि 2.0 में समर्थित है, है ना?) जो आईनेमरेबल को बढ़ाता है, तो आप इसे किसी भी गणना संग्रह पर उपयोग करने में सक्षम होंगे, है ना?

+0

InnerList वास्तव में एक 'सूची ' है:

आप, तो यह कोशिश LINQ के OfType विधि, कि सभी प्रकार का समर्थन करता है के करीब कुछ चाहता है तो। काम पर भी हम वीएस 2008 (यूघ ...) का उपयोग नहीं कर सकते हैं, इसलिए हम 3.5 कंपाइलर के साथ 2.0 को लक्षित नहीं कर सकते हैं। तो नहीं, मैं एक विस्तार विधि का उपयोग नहीं कर सकता। – TheCloudlessSky

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

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