2012-06-17 13 views
7

मैं अपने Apple Property List (संपत्ति सूची) पार्सर (बाइनरी, जेएसओएन, और एक्सएमएल) में LINQ समर्थन जोड़ना चाहता हूं ताकि मैं SQL पर इसका उपयोग कर सकूं जैसे कि आप System.Xml के साथ कर सकते हैं। यह फ़ाइल को पूरी तरह से पार्स करके और ढेर पर सहेजकर काम करता है। (जैसे System.Xml करता है)।मेरी कक्षाओं में LINQ जोड़ना

मैं गुगलिंग कर रहा हूं और इसमें से किसी को भी समझ में नहीं आता है (मुझे Using LINQ to SQL Classes पृष्ठों का बहुत कुछ मिलता है)। MSDN पर मार्गदर्शिका, मुझे या तो समझ में नहीं आता है। मुझे क्या करना चाहिये?

उत्तर

17

को लागू करने LINQ बस ऐसे Where या Select जैसे तरीकों LINQ हो जाने की उम्मीद सही हस्ताक्षरों के साथ,, को लागू करने का मतलब है। सामान्य धारणा के बावजूद, आपको LINQ का समर्थन करने के लिए अपनी कक्षा के लिए IEnumerable इंटरफ़ेस को लागू करने की आवश्यकता नहीं है। हालांकि, IEnumerable लागू करने से स्वचालित रूप से आपको Enumerable कक्षा पर LINQ विधियों का पूरा सेट लगभग मुफ्त में प्राप्त करेगा - आपको केवल GetEnumerator और IEnumerator कक्षा लागू करना होगा।

इस पोस्ट में the Iterator pattern पर इस ब्लॉग में IEnumerable को कार्यान्वित करने के कुछ उदाहरण हैं।

हालांकि, अगर आपकी कक्षा के लिए यह समझ में नहीं आता है, तो आपको ऐसा करने की आवश्यकता नहीं है। आपको बस उचित LINQ विधियों को सीधे लागू करने की आवश्यकता है। LINQ वास्तव में परवाह नहीं करता है कि विधियों को कैसे परिभाषित किया जाता है, जब तक सी # संकलित करता है। यही कारण है, अगर आप लिखते हैं:

mpPlist.Where(p => p.Thing == "Thing").Select(p => p); 

जब तक कि संकलित रूप में, LINQ काम करेगा:

from p in myPlist where p.Thing == "Thing" select p; 

सी # संकलक में इस अनुवाद करता है। विधियों के लिए सही हस्ताक्षर देखने के लिए, एमएसडीएन दस्तावेज के list of LINQ query methods के रूप में देखें। उदाहरण के लिए (मान लेते हैं कि अपने PListPListItem रों की एक सूची थी):

public class PList 
{ 
    public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate) 
    { 
    foreach (var item in this.items) 
    { 
     if (predicate(item)) 
     { 
     yield return item; 
     } 
    } 
    } 
} 

LINQ को लागू करते समय इस तरह से सीधे आप यह कैसे बर्ताव करता है पर एक बहुत अधिक नियंत्रण देता है, यह एक बहुत अधिक इसे पाने के लिए काम है ठीक है, और आपको अपने रिटर्न वैल्यू के प्रभावों को समझने और LINQ कॉल इत्यादि को समझने की आवश्यकता है। आम तौर पर, यदि आप अपनी कक्षा को IEnumerable लागू करने से दूर हो सकते हैं और सी # को आपके लिए सभी काम करने दें, तो चीजें बहुत आसान हो जाती हैं।

+2

बीटीडब्ल्यू, अच्छा ब्लॉग पोस्ट! –

1

चूंकि LINQ ऑब्जेक्ट्स किसी भी वर्ग के साथ काम करता है जो IEnumerable<t> से प्राप्त होता है, आपकी कक्षा में उस इंटरफेस को विरासत में प्राप्त करके और GetEnumerable विधि को परिभाषित करने के लिए पर्याप्त होना चाहिए।

नीचे दिए गए लिंक कैसे IEnumerable इंटरफ़ेस को लागू करने पर बताते हैं (हालांकि यह LINQ उल्लेख नहीं है, यह काम करेंगे): http://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-your-custom-objects/

1

आप IEnumerable पहले लागू करना चाहिए। पढ़ें कि पहले - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

+0

उत्तराधिकारी के रूप में लागू? –

+0

में # # आपको इसे विरासत की तरह घोषित करना होगा और इंटरफ़ेस में परिभाषित सभी सदस्यों को लागू करना होगा। उदा।, यदि आप इंटरफ़ेस _IBoostable_ जो वर्णन _void बूस्ट (पूर्णांक गुणक) के साथ विधि शामिल है _, तो आप उस 'वर्ग MyClass की तरह कुछ लिखना चाहिए: IBoostable { सार्वजनिक शून्य बूस्ट (पूर्णांक गुणक) { DoSomething (गुणक); } } ' –

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