2013-02-02 24 views
9

के लिए एक कुंजी के रूप में एक पूर्णांक सरणी मैं चाहता हूं कि शब्दकोश जो कुंजी के रूप में पूर्णांक की सरणी का उपयोग करता हो, और यदि पूर्णांक सरणी का एक ही मान (यहां तक ​​कि अलग ऑब्जेक्ट उदाहरण) है, तो उन्हें एक ही कुंजी के रूप में माना जाएगा । मैं इसे कैसे करूं?शब्दकोश

निम्न कोड b के रूप में काम नहीं करता है विभिन्न ऑब्जेक्ट उदाहरण हैं।

int[] a = new int[] { 1, 2, 3 }; 
int[] b = new int[] { 1, 2, 3 }; 
Dictionary<int[], string> dic = new Dictionary<int[], string>(); 
dic.Add(a, "haha"); 
string output = dic[b]; 
+1

डुप्लिकेट: http://stackoverflow.com/questions/3383534/dictionary-with-integer-array-as-a-key कृपया इसे 'सूची ' –

उत्तर

20

आप एक IEqualityComparer कैसे शब्दकोश आइटम की तुलना करनी चाहिए परिभाषित करने के लिए बना सकते हैं। यदि आइटम के आदेश प्रासंगिक है, तो कुछ इस तरह काम करना चाहिए:

public class MyEqualityComparer : IEqualityComparer<int[]> 
{ 
    public bool Equals(int[] x, int[] y) 
    { 
     if (x.Length != y.Length) 
     { 
      return false; 
     } 
     for (int i = 0; i < x.Length; i++) 
     { 
      if (x[i] != y[i]) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

    public int GetHashCode(int[] obj) 
    { 
     int result = 17; 
     for (int i = 0; i < obj.Length; i++) 
     { 
      unchecked 
      { 
       result = result * 23 + obj[i]; 
      } 
     } 
     return result; 
    } 
} 

तो यह में पास के रूप में आप शब्दकोश बनाने के लिए:

Dictionary<int[], string> dic 
    = new Dictionary<int[], string>(new MyEqualityComparer()); 

नोट: हैश कोड की गणना यहां प्राप्त: What is the best algorithm for an overridden System.Object.GetHashCode?

+0

के साथ करना है क्यों GetHashCode के अलावा अन्य आवश्यकता है समान ऑपरेटर? – william007

+2

@ william007 क्योंकि 'डिक्शनरी <,>' इसकी चाबियों की हैश टेबल रखता है, और इसलिए 'गेटहाशकोड' होना आवश्यक है जो नए 'बराबर' का सम्मान करता है। इसी कारण से, 'IEqualityComparer <>' इंटरफ़ेस के लिए आपको 'GetHashCode' करने की आवश्यकता है। –

+3

आप इसे ** 'My' ** 'समानता कॉम्पियर' क्यों कहते हैं? तथ्य यह है कि यह तुम्हारा है अप्रासंगिक है। इसे 'IntArrayEqualityComparer' या कुछ समान कहा जाना चाहिए :) – BartoszKP

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