ToLookup और GroupBy अलग क्यों हैं?


111

.ToLookup<TSource, TKey>एक रिटर्न ILookup<TKey, TSource>ILookup<TKey, TSource>इंटरफ़ेस भी लागू करता है IEnumerable<IGrouping<TKey, TSource>>

.GroupBy<TSource, TKey>एक रिटर्न IEnumerable<IGrouping<Tkey, TSource>>

ILookup के पास आसान इंडेक्सर प्रॉपर्टी है, इसलिए इसे डिक्शनरी-जैसे (या लुक-अप) तरीके से इस्तेमाल किया जा सकता है, जबकि GroupBup नहीं कर सकता। इंडेक्सर के बिना GroupBy के साथ काम करने के लिए एक दर्द है; बहुत ही एकमात्र तरीका है कि आप फिर रिटर्न ऑब्जेक्ट को संदर्भित कर सकते हैं इसके माध्यम से लूप करके (या किसी अन्य LINQ- विस्तार विधि का उपयोग करके)। दूसरे शब्दों में, GroupBy जो भी काम करता है, ToLookup भी काम करेगा।

यह सब मुझे इस सवाल के साथ छोड़ देता है कि मैं GroupBy के साथ कभी क्यों परेशान होऊंगा? इसका अस्तित्व क्यों होना चाहिए?


7
GroupByहै IQuerable, ILookupनहीं है
मैग्नस

5
GroupBy सूची को फिर से लिखना नहीं करता है ToLookup इसे उसी तरह दर्शाता है जैसे ToList / ToArray
Aducci

3
मैं इसे कथित तौर पर के बारे में है का डुप्लिकेट है, सवाल के बाद से फिर से खोलने के लिए इस नामित किया है IGrouping बजाय GroupBy और ILookup बजाय ToLookup । उन दोनों के बीच अंतर इन दोनों के बीच अंतर हैं। यह सवालों के जवाब में अंतर से स्पष्ट होना चाहिए।
सैम

1
दोनों ही परिणाम बनाते हैं Lookup, लेकिन GroupByजब परिणाम का संदर्भ दिया
Microsoft.microsoft.com/#System.Core/System/Linq/…

जवाबों:


175

मैं GroupBy के साथ कभी क्यों परेशान होऊंगा? इसका अस्तित्व क्यों होना चाहिए?

जब आप किसी ऑब्जेक्ट पर ToLookup कहते हैं, तो इसमें एक बिलियन पंक्तियों के साथ एक दूरस्थ डेटाबेस तालिका का प्रतिनिधित्व होता है?

अरब पंक्तियों को तार के ऊपर भेजा जाता है, और आप स्थानीय रूप से लुकअप टेबल का निर्माण करते हैं।

जब आप इस तरह के ऑब्जेक्ट पर GroupBy कहते हैं तो क्या होता है?

एक क्वेरी ऑब्जेक्ट बनाया गया है; कहानी का अंत।

जब उस क्वेरी ऑब्जेक्ट को एन्यूमरेट किया जाता है तो टेबल का विश्लेषण डेटाबेस सर्वर पर किया जाता है और समूहित परिणाम एक बार में कुछ मांग पर वापस भेज दिए जाते हैं ।

तार्किक रूप से वे एक ही चीज हैं लेकिन प्रत्येक के प्रदर्शन निहितार्थ पूरी तरह से अलग हैं। ToLookup को कॉल करने का मतलब है कि मुझे अभी समूह द्वारा आयोजित संपूर्ण चीज़ का कैश चाहिए । GroupBy को कॉल करने का अर्थ है "मैं इस प्रश्न का प्रतिनिधित्व करने के लिए एक ऑब्जेक्ट का निर्माण कर रहा हूं कि ये चीजें क्या दिखेंगी यदि मैंने उन्हें समूह द्वारा आयोजित किया है?"


6
पोस्टर विशेष रूप से एक IQueryable<T>प्रतिनिधित्व को लक्षित नहीं करता है । आपका उत्तर उस स्थिति को कवर करता है, लेकिन जब यह सिर्फ सादा ओल IEnumerable<T>(LINQ-to-Objects) होता है, तो ऐसा लग सकता है कि एक के बाद एक, एक का उपयोग करने का कोई कारण नहीं है, जो मुझे लगता है कि @Shlomo पर पाने की कोशिश कर रहा है। नहींIQueryable<T> मामला है, लेकिन LINQ करने वाली वस्तुओं मामले।
कैस्पर ओने

21
@casperOne: मुझे लगता है कि आप मेरी बात समझने में विफल रहे हैं। LINQ-to-Objects मामले में, GroupBy को कॉल करना अभी भी संग्रह पर पुनरावृति नहीं करता है। (जैसा कि अडुकी ने उस उत्तर में बताया, जिसे आपने हटा दिया है।) यह एक बुनियादी अंतर है।
एरिक लिपर्ट

12
@ EricLippert: लेकिन क्या यह कार्यान्वयन का सिर्फ एक साइड इफेक्ट है या क्या यह गारंटी है कि जब आप ToLookup को कॉल करते हैं, तो एन्यूमरेट को पुनरावृत्त किया जाएगा, फिर चाहे वह कार्यान्वयन में कोई भी बदलाव क्यों न हो?

9
@Will: आप एक उत्कृष्ट बिंदु बनाते हैं; प्रलेखन की गारंटी नहीं है कि ToLookup "उत्सुक" है। इसे शायद ध्यान देना चाहिए।
एरिक लिपर्ट

10
ईर्ष्या इसे समझाती है। 'टोमेटा टाइप' की भाषा मुझे लगता है कि उत्सुकता; हालांकि यह स्पष्ट रूप से कार्यान्वयन के लिए छोड़ दिया गया है। दूसरे 'टू' सभी उत्सुक हैं (ToList, ToArray, To मंदार)। धन्यवाद दोस्तों।
श्लोमो

98

साधारण LINQ- दुनिया शब्दों में:

  • ToLookup() - तत्काल निष्पादन
  • GroupBy() - आस्थगित निष्पादन

17

दोनों समान हैं, लेकिन विभिन्न परिदृश्यों में उपयोग किए जाते हैं। .ToLookup()ऐसी वस्तु का उपयोग करने के लिए तैयार लौटाता है जिसमें पहले से ही सभी समूह हैं (लेकिन समूह की सामग्री नहीं) उत्सुकता से भरी हुई है। दूसरी ओर, .GroupBy()समूहों का एक आलसी लोड अनुक्रम देता है।

अलग-अलग LINQ प्रदाताओं में समूहों के उत्सुक और आलसी लोडिंग के लिए अलग-अलग व्यवहार हो सकते हैं। LINQ-to-Object के साथ शायद इससे बहुत कम फर्क पड़ता है, लेकिन LINQ-to-SQL (या LINQ-to-EF, आदि) के साथ, क्लाइंट के बजाय डेटाबेस सर्वर पर ग्रुपिंग ऑपरेशन किया जाता है, और इसलिए आप चाहते हो सकते हैं समूह कुंजी पर एक अतिरिक्त फ़िल्टरिंग करना (जो एक HAVINGखंड उत्पन्न करता है) और फिर उन सभी के बजाय केवल कुछ समूह प्राप्त करें। .ToLookup()इस तरह के शब्दार्थ के लिए अनुमति नहीं देंगे क्योंकि सभी आइटम उत्सुकता से समूहीकृत हैं।

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