2011-08-31 7 views
7

क्या यह परिभाषाओं के साथ लिंक (जैसे: चयन, कहां इत्यादि) के क्वेरी-कीवर्ड का विस्तार करना संभव है? मुझे लगता है कि यह संभव नहीं है, लेकिन अब भी आशा हैक्या सी #/LINQ में क्वेरी-कीवर्ड का विस्तार करना संभव है?

System.Collections.Generic.List<string> aList = 
    new System.Collections.Generic.List<string> { "aa", "ab", "ba", "bb" }; 

// instead of 
string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

// would be nice 
string firstString = from item in aList 
        where item.StartsWith("a") 
        selectFirst item; 

// or something else 
from item in aList 
where item.StartsWith("a") 
WriteLineToConsole item; 

;)

+0

कोई विशेष कारण आप ऐसा क्यों करना चाहते हैं? – AakashM

+0

तीन 400K + उपयोगकर्ताओं ने आपके प्रश्न का उत्तर दिया। जाओ, एक बकरी को मारो! – dotNET

उत्तर

6

एक तरह से प्राप्त करने के लिए इस एक पूर्व प्रोसेसर जो अपने कस्टम बदल सकते हैं लिखने के लिए होगा:

Codeexample यह स्पष्ट करने के LINQ कीवर्ड को मानक LINQ कीवर्ड में संकलक को खिलाने से पहले। वैसे ही यह मानक LINQ कीवर्ड के साथ कैसे काम करता है। एक प्री-प्रोसेसर उन्हें सामान्य एक्सटेंशन विधियों में परिवर्तित करता है (चयन करें, जहां, .GroupBy, ...), और उसके बाद इसे संकलक को फ़ीड करता है जो उन कीवर्ड को समझ में नहीं आता है।

बेशक ऐसा करके आप इंटेलिजेंस खो देंगे, लेकिन इसे विजुअल स्टूडियो एक्सटेंशन लिखकर हल किया जा सकता है। यद्यपि इस चीनी के लिए काफी काम हो सकता है।

+1

क्या आप इस एक्सटेंशन के लिए कुछ प्रारंभ बिंदु प्रदान कर सकते हैं? – Matthias

+0

पता है कि यह एक बहुत पुराना सवाल है, लेकिन क्या आपने कस्टम कीवर्ड के बारे में कुछ करने में कामयाब रहे हैं? –

4

नहीं, भाषा spec या किसी मौजूदा सी # कंपाइलर के भीतर यह संभव नहीं है। जो भी आप वहां बनाते हैं वह अब (शुद्ध) सी # नहीं होगा।

6

आप अपने खुद के प्रासंगिक कीवर्ड नहीं जोड़ सकते हैं, लेकिन मौजूदा लोगों का क्या मतलब है प्रभावित कर सकते हैं।

उदाहरण के लिए, इस कोड:

string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

प्रभावी ढंग से करने के लिए preprocessed है:

string firstString = aList.Where(item => item.StartsWith("a")) 
          .First(); 

... इसलिए यदि आप बदल उन Where और First विधि कॉल क्या मतलब है, आप व्यवहार को प्रभावित कर सकते हैं ।

आप इसके लिए पेट मिल गया है, तो आप this Stack Overflow answer को देखने के लिए चाहते हो सकता है मैं थोड़ी देर के जो पहले कुछ निश्चित परिस्थितियों में संस्थाओं के लिए LINQ में where के व्यवहार में परिवर्तन लिखा था। यह बुराई है, बुरा कोड हालांकि।

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