2009-10-27 22 views
9

मेरे पास एक वर्ग है, नीचे दिखाएं, जिसका उपयोग Dictionary<ValuesAandB, string> में एक कुंजी के रूप में किया जाता है। मुझे इस शब्दकोश के भीतर कोई भी कुंजी खोजने का प्रयास करते समय समस्याएं आ रही हैं, यह कभी नहीं पाती इसको बिलकुल भी नहीं। जैसा कि आप देख सकते हैं, मैंने Equals और GetHashCode ओवरराइड किया है।कस्टम क्लास शब्दकोश में कुंजी के रूप में उपयोग किया जाता है लेकिन कुंजी नहीं मिली

कुंजी मैं

ValuesAandB key = new ValuesAandB(A,B); 
if (DictionaryName.ContainsKey(key)) { 
    ... 
} 

उपयोग कर रहा हूँ पता लगाने के लिए ऐसा कुछ हो जिसमें मैं याद कर रहा हूँ है? क्या कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं?

private class ValuesAandB { 
    public string valueA; 
    public string valueB; 

    // Constructor 
    public ValuesAandB (string valueAIn, string valueBIn) { 
    valueA = valueAIn; 
    valueB = ValueBIn; 
    } 

    public class EqualityComparer : IEqualityComparer<ValuesAandB> { 
     public bool Equals(ValuesAandB x, ValuesAandB y) { 
     return ((x.valueA.Equals(y.valueA)) && (x.valueB.Equals(y.valueB))); 
     } 
     public int GetHashCode(ValuesAandB x) { 
     return x.valueA.GetHashCode()^x.valueB.GetHashCode(); 
     } 
    } 
} 

और किसी से पूछने से पहले, हाँ मूल्य शब्दकोश में हैं!

उत्तर

9

आप शब्दकोश का निर्माण कैसे कर रहे हैं? क्या आप अपने कन्स्ट्रक्टर में अपनी कस्टम समानता तुलनाकर्ता को पास कर रहे हैं?

6

आपने बराबर और GetHashCode को ओवरराइड नहीं किया है। आपने एक दूसरी कक्षा लागू की है जो समानता कॉम्पैडर के रूप में कार्य कर सकती है। यदि आप EqualityComparer के साथ शब्दकोश का निर्माण नहीं करते हैं, तो इसका उपयोग नहीं किया जाएगा।

सबसे आसान फिक्स एक तुलनात्मक को लागू करने के बजाय गेटहाशकोड और बराबर के बराबर ओवरराइड करना होगा (तुलनाकर्ता आमतौर पर केवल तभी दिलचस्प होते हैं जब आपको कई अलग-अलग तुलना प्रकारों (उदाहरण के लिए केस संवेदनशील और केस असंवेदनशील) की आपूर्ति करने की आवश्यकता होती है या जब आपको होने की आवश्यकता होती है एक वर्ग पर तुलना करने में सक्षम है जिसे आप नियंत्रित नहीं करते हैं।

+0

हां, बोर्ड पर ली गई टिप्पणियां और सही जवाब के रूप में सही जवाब दिया गया, लेकिन ग्रेग बीच आपके सामने डर गया। हालांकि मदद के लिए धन्यवाद। –

1

ऐसा लगता है कि आप दो तारों की तुलना कर रहे हैं IIRC, जब उपयोग(), I, आप स्ट्रिंग्स के संदर्भ की तुलना कर रहे हैं, वास्तविक सामग्री नहीं एक समानता कॉम्पैयर को लागू करने के लिए जो तारों के साथ काम करता है, आप स्ट्रिंग.कंपारे() विधि का उपयोग करना चाहेंगे।

public class EqualityComparer : IEqualityComparer<ValuesAandB> 
{ 
    public bool Equals(ValuesAandB x, ValuesAandB y) 
    { 
      return ((String.Compare(x.valueA,y.valueA) == 0) && 
      (String.Compare(x.valueB, y.valueB) == 0)); 
    } 
    // gethashcode stuff here 
} 

मैं कोड के साथ थोड़ा सा हो सकता हूं, जो आपको बंद कर लेना चाहिए ...

+0

नहीं, स्ट्रिंग। एक्वाल्स (स्ट्रिंग) ओवरलोड है जिसे यहां कॉल किया जाएगा, जो सामग्री की तुलना में बहुत स्पष्ट रूप से तुलना करता है। और किसी भी मामले में, स्ट्रिंग। एक्वाल्स (ऑब्जेक्ट) को ऐसा करने के लिए ओवरराइड किया गया है। –

+0

* फेसपाल्म * मुझे यकीन नहीं है कि मैं क्या सोच रहा था। – cloggins

0

मुझे यह समस्या थी, यह पता चला कि शब्दकोश मेरी कुंजी के संदर्भों की तुलना कर रहा था, वस्तु में मान नहीं।

मैं एक कस्टम प्वाइंट क्लास कुंजी के रूप में उपयोग कर रहा था। मैं ToString() और GetHashCode() विधियों और व्हायोला को ओवरराइड करता हूं, कुंजी लुकअप ठीक काम करता है।

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