2013-02-02 14 views
9

Desidero avere il dizionario che utilizza una matrice di numeri interi come chiavi e se l'array intero ha lo stesso valore (anche un'istanza di oggetto diversa), verrà considerato come la stessa chiave . Come dovrei farlo?Un array intero come chiave per Dizionario

Il seguente codice non funziona come b è diverse istanze di oggetto.

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

Duplicate: http://stackoverflow.com/questions/3383534/dictionary-with-integer-array-as-a-key Kindof ha a che fare con '' lista

risposta

20

È possibile creare un IEqualityComparer per definire come il dizionario dovrebbe confrontare articoli. Se l'ordine delle voci è rilevante, allora qualcosa come questo dovrebbe funzionare:

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; 
    } 
} 

quindi farla passare come si crea il dizionario:

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

Nota: calcolo del codice hash ottenuto qui: What is the best algorithm for an overridden System.Object.GetHashCode?

+0

Perché v'è una necessità di GetHashCode diverso l'operatore uguale? – william007

+2

@ william007 Perché un dizionario '<,>' mantiene una tabella hash delle sue chiavi, e quindi è necessario avere un 'GetHashCode' che rispetti il ​​nuovo' Equals'. Per lo stesso motivo, l'interfaccia 'IEqualityComparer <>' richiede di fare 'GetHashCode'. –

+3

Perché lo chiamate ** 'My' **' EqualityComparer'? Il fatto che sia tuo è irrilevante. Dovrebbe essere chiamato "IntArrayEqualityComparer" o qualcosa di simile :) – BartoszKP

Problemi correlati