2012-04-18 22 views
75

.ToLookup<TSource, TKey>ILookup<TKey, TSource> देता है। ILookup<TKey, TSource> इंटरफ़ेस IEnumerable<IGrouping<TKey, TSource>> लागू करता है।ToLookup और GroupBy क्यों अलग हैं?

.GroupBy<TSource, TKey> एक IEnumerable<IGrouping<Tkey, TSource>> देता है।

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

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

+5

'GroupBy' है' IQuerable', 'ILookup' नहीं है – Magnus

+5

GroupBy नहीं करता ' सूची [ToLookup] की गणना करें (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.tolookup.aspx) यह वही तरीका बताता है जैसे ToList/ToArray – Aducci

+3

मैंने इसे फिर से खोलने के लिए नामांकित किया है चूंकि सवाल यह कथित रूप से एक है * ToLookup * के बजाय * ग्रुपबी * और * ILookup * के बजाय * IGrouping * के डुप्लिकेट के बारे में है। उन दोनों के बीच मतभेद इन दोनों के बीच मतभेदों के लिए अलग हैं। यह प्रश्नों के बीच उत्तरों में मतभेदों से स्पष्ट होना चाहिए। – Sam

उत्तर

130

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

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

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

क्या होता है जब आप इस तरह के एक वस्तु पर GroupBy कहते हैं?

एक क्वेरी वस्तु बनाया गया है; कहानी का अंत।

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

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

+3

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

+0

यह मुझे LINQ के लिए सुसंगत होने के लिए फायदेमंद बनाता है, जहां संभव हो। मुझे लगता है कि LINQ-to-SQL में इसकी उपयोगिता का प्रदर्शन करना LINQ-to-Objects में इसे छोड़ने के औचित्य के लिए पर्याप्त है। – Brian

+19

@casperOne: मुझे लगता है कि आप मेरे बिंदु को समझने में नाकाम रहे हैं। LINQ-to-ऑब्जेक्ट्स केस में भी, समूहबी * को कॉल करना * अभी भी संग्रह पर पुन: सक्रिय नहीं होता है। (जैसा कि एडुची ने आपके द्वारा हटाए गए उत्तर में बताया।) यह एक मौलिक अंतर है। –

12

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

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

70

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

  • ToLookup() - तत्काल निष्पादन
  • GroupBy() - आस्थगित निष्पादन
संबंधित मुद्दे