2012-04-04 25 views
12

मैं एक शब्दकोश है जो एक सूची से keyed है:सी # सूची के रूप में शब्दकोश कुंजी

private Dictionary<List<custom_obj>, string> Lookup; 

मैं ContainsKey उपयोग करने के लिए कोशिश कर रहा हूँ, लेकिन यह काम किया जाना प्रतीत नहीं होता है, और मुझे पता नहीं क्यों है । यहाँ मेरी दृश्य स्टूडियो तत्काल खिड़की से डिबग जानकारी है:

?Lookup.Keys.ElementAt(7)[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
?Lookup.Keys.ElementAt(7)[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
searchObject[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
searchObject[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
?Lookup.ContainsKey(searchObject) 
false 

मेरे सामान्य ज्ञान में, कि पिछले ContainsKey सच होना चाहिए। उम्मीद है कि मैंने यहां पर्याप्त जानकारी शामिल की है ... कोई विचार?

धन्यवाद!

उत्तर

14

List<custom_obj> उदाहरण कुंजी के रूप में कार्य करने वाला उदाहरण खोज ऑब्जेक्ट द्वारा निर्दिष्ट उदाहरण के लिए संदर्भित रूप से असमान है।

आप शब्दकोश निर्देशात्मक समानता के बजाय सूची में मानों का उपयोग कर मिलान कुंजी खोजने के लिए चाहते हैं, आप एक IEqualityComparer शब्दकोश की constructor में प्रदान करना होगा (जब से तुम List<T> में बराबर है और GetHashCode ओवरराइड नहीं कर सकते)।

3

यह केवल तभी काम करेगा जब लुकअप में उपयोग की जाने वाली वास्तविक सूची उदाहरण एक कुंजी के रूप में जोड़ा गया उदाहरण जैसा ही है। यह सूची सामग्री की तुलना नहीं करेगा। यदि आप दो सूची वस्तुओं की तुलना करने की कोशिश करते हैं तो यह वही व्यवहार होगा जो आपको मिलेगा।

8

आपके पास दो अलग List एस हैं जिनमें एक ही तत्व हैं। यह पता लगाने का सही तरीका है कि दो सूचियां बराबर हैं SequenceEqual विधि के साथ।

आप डिफ़ॉल्ट रूप से ऐसा नहीं कर सकते जो आप करने की कोशिश कर रहे हैं। हालांकि, आप एक कस्टम IEqualityComparer लिख सकते हैं और इसे Dictionary कन्स्ट्रक्टर में पास कर सकते हैं।

यहां नमूने के सामान्य IEqualityComparer है:

class ListComparer<T> : IEqualityComparer<List<T>> 
{ 
    public bool Equals(List<T> x, List<T> y) 
    { 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(List<T> obj) 
    { 
     int hashcode = 0; 
     foreach (T t in obj) 
     { 
      hashcode ^= t.GetHashCode(); 
     } 
     return hashcode; 
    } 
} 

के रूप में इस के लिए एक त्वरित और गंदे समाधान था तुम्हें पता है, GetHashCode कार्यान्वयन पर सुधार करने के लिए कर सकते हैं।

+0

GetHashCode में वापसी की कमी है। –

+0

त्वरित नोट: जैसा कि उत्तर संकेत देता है, आपको इस तुलनाकर्ता का उपयोग नहीं करना चाहिए। बराबर विधि आदेश के प्रति संवेदनशील है लेकिन हैश विधि नहीं है। –

0

क्या आप निश्चित हैं कि आप जिस लुकअप विधि में उपयोग कर रहे हैं वह वही उदाहरण है जो आपके शब्दकोश की चाबियों में से एक है? यही वह चीज है जिसे मैं सोच सकता हूं।

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