2011-02-03 12 views
6

Mam klasę, która wygląda tak.C# użyj obiektu klasy jako klucza w słowniku

public class Point : IEquatable<Point> 
{ 
    public int _xValue {get;set;} 
    public double _yValue {get;set;} 

    public Point(int x, double y) 
    { 
     _xValue = x; 
     _yValue = y; 
    } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as Point); 
    } 

    public bool Equals(Point obj) 
    { 
     return obj != null && obj._xValue == this._xValue && obj._yValue == this._yValue; 
    } 


} 

trzeba zaimplementować funkcję GetHashCode tak, że można go używać jako klucz słownika. Ale nie wiem, co musi w tej sytuacji zwrócić funkcja GetHashCode. Czy ktoś może mi pomóc?

+0

Czy to może być to, czego szukasz? http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode –

+0

piękny. dzięki – Aks

+0

@astander: Gdy pytanie już zostało zadane i udzielono na nie odpowiedzi, oznacz go jako duplikat. Masz do tego mnóstwo powtórzeń. (Czyżbyś nie głosował na dzisiaj?) –

Odpowiedz

4

Powinna zwracać liczbę całkowitą, najlepiej unikalną dla każdej oddzielnej instancji obiektu. Wartość mieszająca to w zasadzie jedna liczba utworzona z treści obiektu, używana do jednoznacznej identyfikacji tego obiektu. Zasada numer jeden polega na tym, że jeśli dwa z tych punktów są sobie równe, wartość mieszania powinna być taka sama dla obu.

Bardziej szczegółowy opis jest dostępny na MSDN

2

Funkcja GetHashCode musi powrócić am liczbę całkowitą, która będzie jednoznacznie zidentyfikować jedną instancję obiektu od drugiego, tak aby uniknąć kolizji, gdy jest używany jako klucz w słowniku .

Powinieneś być w stanie niezawodnie odtworzyć kod skrótu, więc staraj się unikać użycia wartości losowych lub wartości daty jako zarodków dla kodu skrótu.

0

W twoim przypadku, można zrobić coś takiego:

return x^y;

+1

y jest typu double – leeny

1

można zrobić _xValue^_yValue.GetHashCode()

1

Istnieje kilka podstawowych zasad to:

  • Bool: jeśli true return 0, inaczej zwrócony 1
  • Bajt char, krótkie lub Int: zwraca wartość typu
  • długi: zwrotny (int) (F^F (>>> 32))
  • pływakowy: powrotu Convert.ToInt32 wartości typu
  • obiektu: powrót do wartości wygenerowanego przez wywołanie object.GetHashCode()
  • tablicy: Iteracja cały układ i leczenia każdego elementu indywidualnie

, więc w twoim przypadku masz x = int i y = double, jeśli zastosujesz się do tych zasad, znajdziesz rozwiązanie.

return x^y.GetHashCode();

Zawsze można dodać fantazyjne algorytmy matematyczne, ale należy zachować ostrożność w przypadku kolizji numerycznych.

+0

konwertowanie na int naruszałoby wyjątkowość (2.6 -> 3, podobnie jak 2.9 itd.). Myślę, że ma to więcej sensu, aby zrobić x^y.GetHashCode() – leeny

+0

Masz rację, dzięki! –

Powiązane problemy