2009-08-26 9 views
63

मुझे ILookup<TKey, TVal> और IGrouping<TKey, TVal> के बीच अंतर को व्यक्त करने में परेशानी हो रही है, और अगर मैं इसे सही ढंग से समझता हूं तो उत्सुक हूं। LINQ ने IGrouping आइटमों के अनुक्रमों का उत्पादन करके इस मुद्दे को संकलित किया जबकि मुझे ToLookup विस्तार विधि भी प्रदान की। तो ऐसा लगा कि वे वही थे जब तक कि मैं अधिक बारीकी से नहीं देखा।ILookup <TKey, TVal> बनाम IGrouping <TKey, TVal>

var q1 = 
    from n in N 
    group n by n.MyKey into g 
    select g; 
// q1 is IEnumerable<IGrouping<TKey, TVal>> 

कौन सा के बराबर है:

var q2 = N.GroupBy(n => n.MyKey, n => n); 
// q2 is IEnumerable<IGrouping<TKey, TVal>> 

कौन सा की तरह एक बहुत लग रहा है:

var q3 = N.ToLookup(n => n.MyKey, n => n); 
// q3 is ILookup<TKey, TVal> 

हूँ मैं निम्नलिखित उपमा में सही हूँ?

  1. एक IGrouping<TKey, TVal> एक समूह (यानी एक बंद अनुक्रम), KeyValuePair<TKey, TVal> के अनुरूप जहां मूल्य वास्तव में तत्वों (बजाय एक एकल तत्व से) का एक अनुक्रम
  2. एक IEnumerable<IGrouping<TKey, TVal>> उन लोगों में से एक दृश्य है (जैसा होता है क्या आप जब एक IDictionary<TKey, TVal>
  3. से अधिक पुनरावृत्ति प्राप्त करने के लिए एक ILookup<TKey, TVal> अधिक एक IDictionary<TKey, TVal> जहां मूल्य वास्तव में तत्वों

उत्तर

63

हाँ, उन सभी correc हैं का एक क्रम है की तरह है टी।

और ILookup<TKey, TValue> भी IEnumerable<IGrouping<TKey, TValue>> बढ़ाता है ताकि आप सभी कुंजी/संग्रह जोड़े के साथ-साथ (या इसके बजाय) विशेष कुंजी को देख सकें।

मूल रूप से ILookup<TKey,TValue>IDictionary<TKey, IEnumerable<TValue>> जैसा लगता है।

ध्यान रखें कि ToLookup एक "इसे अभी करें" ऑपरेशन (तत्काल निष्पादन) है जबकि GroupBy स्थगित है। जैसा कि होता है, जिस तरह से "LINQ खींचें" काम करता है, जब आप IGrouping एस GroupBy के परिणाम से खींचते हैं, तो इसे सभी डेटा को वैसे भी पढ़ना पड़ता है (क्योंकि आप समूह के माध्यम से समूह को स्विच नहीं कर सकते हैं) जबकि अन्य कार्यान्वयन में यह स्ट्रीमिंग परिणाम उत्पन्न करने में सक्षम हो सकता है। (यह पुश LINQ में करता है; मैं उम्मीद करता हूं कि LINQ से ईवेंट समान हों।)

+0

उत्तर के लिए धन्यवाद। मैं पहले पुश/पुल के मामले में लिंक की सोच में नहीं आया हूं। जब मैं Google पर गया तो मैं आपके ब्लॉग में से एक आया, इसलिए मैं इसे देख लूंगा। इसके बारे में सोचने के लिए एक दिलचस्प तरीका लगता है। – mckamey

+0

मुझे अभी भी लगता है कि ये मतभेद 2 अलग-अलग इंटरफेस को उचित नहीं ठहराते हैं। मुझे लगता है कि लाइब्रेरी डिजाइनर को सिर्फ एक इंटरफ़ेस के लिए निर्णय लेना चाहिए था।हो सकता है कि यहां सिर्फ एक व्यक्तिगत स्वाद है जो कुछ स्पष्ट नहीं है। – rudimenter

+0

क्या यह मुझे है या ग्रुपबी बनाम ग्रुपजॉइन के साथ कुछ भ्रम है? वे केवल _conceptually_ संबंधित हैं। शायद यह जवाब में सिर्फ एक टाइपो है। – sehe

8

आईएलूकअप और आईडीर्नी के बीच एक और महत्वपूर्ण अंतर है: पूर्व इस अर्थ में अपरिवर्तनीयता को लागू करता है कि डेटा को बदलने के लिए यहां कोई तरीका नहीं है (सिवाय इसके कि जब उपभोक्ता एक स्पष्ट कलाकार का प्रदर्शन करता है)। इसके विपरीत, IDictionary में "एड" जैसी विधियां हैं जो डेटा को बदलने की अनुमति देती हैं। तो, कार्यात्मक-प्रोग्रामिंग और/या समांतर प्रोग्रामिंग के परिप्रेक्ष्य से, ILookup अच्छा है। (मैं केवल इलुकअप का एक संस्करण था जो समूह के बजाए एक कुंजी के लिए केवल एक मान निर्दिष्ट करता है।)

(बीटीडब्लू।, यह इंगित करने योग्य लगता है कि आईनेमेरबल और आईएलिस्ट के बीच संबंध कुछ हद तक समान है ILookup और IDictionary के बीच एक - पूर्व अपरिवर्तनीय है, उत्तरार्द्ध नहीं है।)

+3

आप एक 'ILookup' क्यों चाहते हैं जिसमें समूह के बजाय केवल एक आइटम आइटम हो? यदि आप इसे अपरिवर्तनीय बनाना चाहते हैं तो यही 'शब्दकोश' है - या 'ReadOnlyDictionary' या' IReadOnlyDictionary' '। – ErikE

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