2010-11-12 18 views
17

नोट: इससे पहले कि आप पढ़ने या उत्तर देने से पहले, मुझे Enumerable.Distinct के बारे में पता है, मैं विधि के बारे में नहीं, उस विधि के लिए विशिष्ट भाषा समर्थन के बारे में पूछ रहा हूं।LINQ में 'विशिष्ट' कीवर्ड क्यों नहीं है?

मैं हमेशा आश्चर्य किया है कि क्यों वहाँ सी # LINQ कीवर्ड सेट इतना है कि मैं लिख सकता है में कोई distinct कीवर्ड है:

var items = distinct from x in y 
      select x; 

या

var items = from x in y 
      select distinct x; 

किसी को पता है क्यों यह शामिल नहीं किया गया या इसे शामिल करना एक बुरा विचार क्यों होगा? यह सिर्फ मुझे लगता है कि मुझे Distinct() पर कॉल करने के लिए क्वेरी को लपेटना है; distinct कीवर्ड अधिक प्राकृतिक महसूस करेगा।

नोट: मुझे पता है कि Distinct विधि तुलनात्मक रूप से तुलना करने के लिए ओवरराइड है, लेकिन डिफ़ॉल्ट तुलनाकर्ता का उपयोग करने वाला एक कीवर्ड बहुत अच्छा होगा। मैं distinct by कीवर्ड संयोजन की भी कल्पना कर सकता हूं ताकि एक तुलना ऑपरेटर को क्वेरी में इनलाइन प्रदान किया जा सके।

+1

काश हम यह भी था। बहुत अधिक पठनीय होगा, और ime यह अक्सर उपयोग किया जाता है। –

+0

@qstarin: मैंने सवाल पूछा क्योंकि मुझे इसे 5 दिनों के लिए 2 दिनों में चाहिए था। –

+0

शायद हमें "सी # के लिए एक अलग खोजशब्द" फेसबुक समूह शुरू करना चाहिए। इसे एसएनएल पर बेट्टी व्हाइट मिला ... –

उत्तर

10

चार्ली कैल्वर्ट में blog post ("Using Distinct and Avoiding Lambdas") इस मुद्दे पर चर्चा कर रहा है। पोस्ट के शीर्ष से:

  1. अधिकांश क्वेरी ऑपरेटरों ऐसे Select(), Where() और GroupBy() के रूप में कुछ एक पैरामीटर के रूप में एक लैम्ब्डा कहा जाता है ले लो।
  2. लैम्ब्डा लिखना मुश्किल है।
  3. प्रश्नोत्तरी अभिव्यक्तियों को बड़े हिस्से में बनाया गया ताकि डेवलपर्स को लैम्बडा से जुड़े जटिल वाक्यविन्यास को सीखने के बिना LINQ का उपयोग करने की अनुमति मिल सके।
  4. कुछ क्वेरी ऑपरेटर, जैसे Distinct(), पैरामीटर के रूप में लैम्बडास न लें। नतीजतन, वे कॉल करना आसान है।
  5. इसलिए क्वेरी अभिव्यक्तियों को Distinct() जैसे ऑपरेटर के लिए नहीं बनाया गया था जो लैम्बडा नहीं लेते हैं।

और यह भी, आगे पोस्ट में नीचे से:

क्वेरी ऑपरेटरों विधि कॉल कर रहे हैं। दूसरे शब्दों में, LINQ API में Select(), Group(), Distinct() इत्यादि नामक विधियां हैं। हम आमतौर पर इन तरीकों को सीधे कॉल नहीं करते हैं क्योंकि वे लेम्बास को पैरामीटर के रूप में लेते हैं, और कई लोगों को लगता है कि लैम्ब्डा को समझना मुश्किल है। डेवलपर्स को लैम्ब्डा लिखने के जटिल कार्य से बचने में मदद करने के लिए, टीम ने क्वेरी एक्सप्रेशन का आविष्कार किया, जो कि "सिंटैक्टिक चीनी" है जो लैम्बडास के शीर्ष पर बैठती है।

टी एल; डॉ: वहाँ सादगी की खातिर कोई distinct कीवर्ड, क्योंकि distinct एक लैम्ब्डा अभिव्यक्ति नहीं लेता है।

+2

ग्रेट उत्तर, धन्यवाद। यह सब अच्छा लगता है, लेकिन यह इस सामान का उपयोग करने वाले लोगों के साथ फिट नहीं है। यह बेहद उपयोगी होगा और चीजों को पढ़ने में बहुत आसान बनाता है। मुझे नहीं लगता कि चार्ली कैल्वर्ट द्वारा दिए गए तर्क वास्तव में उस मजबूत हैं - खासकर जब कीवर्ड वीबी के लिए शामिल था। –

+6

"हम आमतौर पर इन तरीकों को सीधे कॉल नहीं करते हैं क्योंकि वे लेम्बास को पैरामीटर के रूप में लेते हैं, और कई ** लुसी प्रोग्रामर जो उनके नमक के लायक नहीं हैं ** पाते हैं कि लैम्ब्डा को समझना मुश्किल है" - एफटीएफवाई। – Juliet

+2

आप दोनों के साथ पूरी तरह से सहमत हैं। लैम्ब्डास मुश्किल नहीं हैं, और मैं इससे पहले इस पर चढ़ गया हूं - "रुको, तो एक 'अलग()' विधि है लेकिन कोई 'विशिष्ट' कीवर्ड नहीं है?" मुझे थोड़ा समझ में आता है। – Donut

14

वीबी में, वास्तव में है।

Dim l = From x In {1, 2, 3, 2, 4, 2} Distinct Select x 

मुझे लगता नहीं है सी # के लिए distinct के खिलाफ कुछ सक्रिय निर्णय किया गया है, यह सिर्फ लागू नहीं किया गया है।

+0

बेशक, मैं वीबी में अपना सभी LINQ लिखना नहीं चाहता हूं। :) –

+2

वीबी क्वेरी प्रारूप में 'टेक' और 'छोड़ें' का भी समर्थन करता है। –

+0

वीबी में क्वेरी प्रारूप में 'कुल ... में' है? क्या यह सी # में भी मौजूद है? – Dario

5

रिवार्ड: distinct एक सेट ऑपरेटर है ... सेट ऑपरेटर लेम्बास को पैरामीटर के रूप में नहीं लेते हैं। सी # टीम ने आपको Select() और Group() जैसे लैम्बडास लेने के तरीकों के लिए शॉर्टकट देने का निर्णय लिया, क्योंकि उन्हें लगा कि लैम्बडा बस लोगों से भ्रमित हो सकते हैं। .Distinct() लैम्ब्डा नहीं लेता है, इसलिए जब आप इसे सीधे कॉल करते हैं तो यह स्पष्ट होता है। इस विषय पर

एक अच्छा पढ़ा:
http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

+1

यह भेद बताता है, लेकिन मुझे अभी भी नहीं लगता कि यह सवाल का जवाब देता है। 'in' lambda का उपयोग नहीं करता है। यह एक सुविधा है। तर्क त्रुटिपूर्ण है, खासकर जब यह देखते हुए कि वीबी को कीवर्ड मिला। मुझे लगता है कि औचित्य कमजोर है - यह आपके उत्तर की आलोचना नहीं है क्योंकि आप जानकारी रिले कर रहे हैं, लेकिन आपको मेरा मुद्दा मिल गया है। –

+0

पुरस्कृत। आप सही हैं, कुंजी यह है कि यह सिर्फ एक सुविधा है। सी # टीम ने फैसला किया कि 'डिस्टिंक()' (स्पष्ट रूप से वीबी टीम असहमत) पर सुविधा की कोई आवश्यकता नहीं थी। –

+1

मुझे लगता है कि उन्होंने अलग-अलग संबंधों के साथ एक खराब निर्णय लिया है। –

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