2015-09-02 22 views
6

मैं LINQ में GroupBy विधि के माध्यम से जा रहा था:GroupBy और IEqualityComparer <TKey> comparer

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector, 
    IEqualityComparer<TKey> comparer 
) 

मैं समझता हूँ GroupBy और क्या यह रिटर्न का उपयोग कैसे करें। मैं IEqualityComparer<TKey> comparer के महत्व को समझना चाहता हूं और वास्तव में ग्रुपबी में इसका क्या उपयोग किया जाता है।

+0

'वापसी x.Length - y.Length> = 0; 'आप समानता मापने के तरीके के रूप में इसका उपयोग क्यों कर रहे हैं? –

+0

मैं सिर्फ यह देखना चाहता था कि यह कैसे काम करता है। –

उत्तर

10

IEqualityComparer<TKey> उद्देश्य यह है कि समूह में होना चाहिए एक दो कदम जाँच करने के लिए अगर एक TKey उदाहरण किसी मौजूदा समूह के प्रमुख के लिए "बराबर" है देखने के लिए उपयोग किया जाएगा और इस प्रकार:

  1. यह जाँच करता है मौजूदा कुंजी के हैश कोड के खिलाफ आइटम का हैश कोड (GetHashCode का उपयोग कर)। यदि यह किसी भी मान के बराबर नहीं है तो इसे एक नए समूह में जोड़ा जाता है
  2. यदि कोई मिलान हैश कोड पाया जाता है, तो तब समानता के लिए जांच करता है (Equals का उपयोग करके)। यदि आइटम समूह कुंजी के बराबर है, तो आइटम उस समूह में जोड़ा जाता है।

आप नहीं आपूर्ति एक comparer (या तो null गुजर या भार के कि कि पैरामीटर नहीं होता है में से एक का उपयोग करके) करते हैं, "deafult" comparer प्रयोग किया जाता है, जो अगर यह TKey वर्ग खुद का उपयोग करता है IEquatable लागू करता है या Equals और GetHashCode के किसी भी लागू ओवरराइड लागू करता है।

तो यह संकेत मिलता है Equals और GetHashCode के बीच कुछ महत्वपूर्ण रिश्ते:

  • दो तो आइटम बराबर हैं, वे चाहिए एक ही हैश कोड है।
  • विपरीत नहीं है - एक ही हैश कोड वाले दो आइटम बराबर होने के लिए नहीं हैं।
+0

अच्छी तरह से समझाया। धन्यवाद! –

-1

आपने एक गैरकानूनी समानता तुलनाकर्ता प्रदान किया है, इसलिए आपके परिणाम अनौपचारिक होने जा रहे हैं। आपका हैश कोड तुलनात्मक के संदर्भ पर आधारित है, जिसका आपके Equals विधि में कुछ भी नहीं है, और आपके Equals विधि में आप कह रहे हैं कि पहली वस्तु बराबर या उससे अधिक लंबी है दूसरी स्ट्रिंग यह सिर्फ कोई समझ नहीं आता है, यह समानता के मूल गुणों का भी उल्लंघन करता है जिसमें पैरामीटर का क्रम अप्रासंगिक होना चाहिए।

+0

मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए, इसलिए मैंने इसे त्वरित परिणाम के लिए लिखा है कि यह कैसे काम करेगा –

+0

@ विशाललंद आप यह देखने के लिए प्रलेखन पढ़ सकते हैं कि यह कैसे काम करता है। जब आप इसे गलत तरीके से उपयोग करते हैं, तो यह आपके लिए कुछ भी समझ में नहीं आता है, जैसा कि आपने स्वयं को देखा है। यदि आपको पता नहीं है कि आप वास्तव में क्या करना चाहते हैं, तो ऐसा करने में आपकी सहायता करने का कोई तरीका नहीं है। – Servy

+0

उत्तर के लिए धन्यवाद। मैंने सवाल संपादित किया है। शायद अब यह और अधिक समझ जाएगा। आप सही हैं, शायद कार्यान्वयन का कोई मतलब नहीं है। मैं सिर्फ एपीआई के आसपास खेल रहा हूँ। जैसे कि जब हम ऑर्डरबी या ऑर्डरबैडसेकिंग या फिरबी का उपयोग करते हैं, तो IEqualityComparer तुलनाकर्ता, ऑर्डर करने के लिए तुलना करने के लिए उपयोग किया जाता है। मैं उन परिदृश्यों को समझने में सक्षम नहीं हूं जहां मैं ग्रुपबी में ऐसी चीज करता हूं। मुझे समूह में तुलना करने की आवश्यकता क्यों है। यदि आप एक उदाहरण के साथ समझा सकते हैं जो मेरी मदद करेगा। –

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