Linq में Cast () and Oftype () का उपयोग कब करें


211

मैं Linq IEnumerableसे एक Arraylistमें कास्टिंग प्रकार के दो तरीकों से अवगत हूं और सोच रहा हूं कि उन्हें किस मामले में उपयोग करना है?

जैसे

IEnumerable<string> someCollection = arrayList.OfType<string>()

या

IEnumerable<string> someCollection = arrayList.Cast<string>()

इन दो तरीकों में क्या अंतर है और मुझे प्रत्येक मामले को कहां लागू करना चाहिए?

जवाबों:


322

OfType- केवल उन तत्वों को लौटाएं जो सुरक्षित रूप से x टाइप करने के लिए डाले जा सकते हैं।
Cast- सभी तत्वों को टाइप x में डालने का प्रयास करेंगे। यदि उनमें से कुछ इस प्रकार से नहीं हैं, तो आपको मिलेगाInvalidCastException


उदाहरण के लिए संपादित करें :

object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }

1
उसके लिए खुश हो जाओ। पहले से दोनों की कोशिश की लेकिन दोनों के पास सभी प्रकार के तत्व थे, इसलिए मुझे अंतर दिखाई नहीं दे रहा था।

6
@SLaks सही ढंग से बताते हैं कि आपको यह Cast<T>सुनिश्चित करने के लिए उपयोग करना चाहिए कि संग्रह में केवल प्रकार के Tतत्व हैं। प्रकार की जाँच के OfType<T>कारण धीमी है is। यदि संग्रह प्रकार का है IEnumerable<T>, Cast<T>तो पूरे संग्रह को बस के रूप में रखा जाएगा IEnumerable<T>और इसे मानने से बचें; OfType<T>अब भी गूंजता रहेगा। ref: stackoverflow.com/questions/11430570/…
hIpPy

23
यहां तक ​​कि ऐसे मामलों में जहां .Cast<string>()इसे एन्यूमरेट किया जाता है , वहां नहीं फेंका जाता है, यह समकक्ष नहीं है .OfType<string>()। कारण यह है कि nullमूल्यों को हमेशा छोड़ दिया जाता है .OfType<TResult>()। एक उदाहरण: new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()केवल देगा 3; के साथ .Cast<string>()मूल्यांकन करने के लिए इसी तरह की अभिव्यक्ति 4
जेपी स्टिग नीलसन

1
दूसरे शब्दों में, यह
'21

111

http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/

मौलिक रूप से, कास्ट () इस तरह लागू किया जाता है:

public IEnumerable<T> Cast<T>(this IEnumerable source)
{
  foreach(object o in source)
    yield return (T) o;
}

एक स्पष्ट कास्ट का उपयोग करना अच्छा प्रदर्शन करता है, लेकिन अगर परिणाम विफल हो जाता है तो एक InvalidCastException में परिणाम होगा। इस विचार पर एक कम कुशल अभी तक उपयोगी भिन्नता है टाइप ():

public IEnumerable<T> OfType<T>(this IEnumerable source)
{
  foreach(object o in source)
    if(o is T)
      yield return (T) o;
}

लौटी गणना में केवल वे तत्व शामिल होंगे जो सुरक्षित रूप से निर्दिष्ट प्रकार के लिए डाले जा सकते हैं।


38

आपको कॉल करना चाहिए Cast<string>()अगर आपको पता है कि सभी आइटम stringएस हैं।
यदि उनमें से कुछ तार नहीं हैं, तो आपको एक अपवाद मिलेगा।

OfType<string>()आपको पता होना चाहिए कि क्या आपको पता है कि कुछ आइटम stringएस नहीं हैं और आप उन वस्तुओं को नहीं चाहते हैं।
यदि उनमें से कुछ तार नहीं हैं, तो वे नए में नहीं होंगे IEnumerable<string>


1
यह उत्तर (वर्तमान में) केवल वही है जो किस विधि का उपयोग करने के लिए एक स्पष्ट सलाह देता है।
कोडफॉक्स

4

यह ध्यान देने योग्य है कि Cast(Of T)पर इस्तेमाल किया जा सकता IEnumerableहै, अन्य LINQ कार्यों के विपरीत वहाँ कभी एक मामले में जहां आप एक गैर सामान्य संग्रह या इस तरह के एक के रूप में सूची पर उपयोग LINQ करने की आवश्यकता है, इसलिए यदि ArrayListहै, तो आप उपयोग कर सकते हैं Cast(Of T)एक करने के लिए कलाकारों को IEnumerable(Of T)जहां LINQ काम कर सकते हैं।


2

Cast()संग्रह के सभी तत्वों को कास्ट करने की कोशिश करेंगे (और यदि तत्व गलत प्रकार का है तो एक अपवाद फेंक देंगे) जबकि OfType()उचित प्रकार के तत्वों को वापस कर देंगे।


2

OfTypeकेवल निर्दिष्ट प्रकार के लोगों को वापस करने के लिए तत्वों को फ़िल्टर करेगा। Castयदि कोई तत्व लक्ष्य प्रकार में नहीं डाला जा सकता है तो दुर्घटना होगी।


2

Cast<T>दिए गए प्रकार को सभी आइटम कास्ट करने का प्रयास करेंगे T। यह कास्ट विफल हो सकता है या एक अपवाद फेंक सकता है। OfType<T>मूल संग्रह का एक सबसेट लौटाएगा और केवल उन वस्तुओं को लौटाएगा जो प्रकार की हैं T

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.