gewusst wie: implementieren, überschreiben von GetHashCode() mit der Logik der überschriebenen Equals () -
Ich habe einige Klassen, wie unten, habe ich umgesetzt Equals(Object)
Methode für fast alle von Ihnen. Aber ich weiß nicht, wie zu schreiben GetHashCode()
. So weit ich diese Datentypen als Wert geben Sie eine Dictionary
Sammlung, ich denke, ich sollte überschrieben GetHashCode()
.
1.Ich weiß nicht, wie zu implementieren GetHashCode()
mit Logik Equals(Object)
.
2.Es gibt einige abgeleitete Klassen, wenn ich override GetHashCode()
und Equals(Object)
für die base-Klasse ( Param
), ist es immer noch notwendig, um es zu überschreiben für Kinder?
class Param
{
...
public Int16 id { get; set; }
public String name { get; set; }
...
public override bool Equals(object obj)
{
if ( obj is Param){
Param p = (Param)(obj);
if (id > 0 && p.id > 0)
return (id == p.id);
else if (name != String.Empty && p.name != String.Empty)
return (name.equals(p.name));
else
return object.ReferenceEquals(this, obj);
}
return false;
}
}
class Item
{
public int it_code { get; set; }
public Dictionary<String, Param> paramAr { get; set; }
...
public override bool Equals(Object obj)
{
Item im = new Item();
if (obj is Item)
im = (Item)obj;
else
return false;
if (this.it_code != String.Empty && im.it_code != String.Empty)
if (this.it_code.Equals(im.it_code))
return true;
bool reParams = true;
foreach ( KeyValuePair<String,Param> kvp in paramAr ){
if (kvp.Value != im.paramAr[kvp.Key]) {
reParams = false;
break;
}
}
return reParams;
}
}
class Order
{
public String or_code { get; set; }
public List <Item> items { get; set; }
...
public override bool Equals( Object obj ){
Order o = new Order();
if (obj is Order)
o = (Order)obj;
else
return false;
if (this.or_code != String.Empty && o.or_code != String.Empty)
if (this.or_code.Equals(o.or_code))
return true;
bool flag = true;
foreach( Item i in items){
if (!o.items.Contains(i)) {
flag = false;
break;
}
}
return flag;
}
}
EDIT:
ich bekomme diese Warnung:
Warnung : 'Item' - Objekt überschreibt.Equals(object o) aber nicht
Objekt überschreiben.GetHashCode()
GetHashCode
, ist, dass wenn zwei Objekte gleich sind (durch Aufruf Equals
) , deren hash-code muss auch gleich sein. Umgekehrt, wenn beide hash-codes gleich sind, das bedeutet nicht, dass die Objekte selbst sind gleich (obwohl Sie könnte). Wenn Sie schreiben eine benutzerdefinierte Implementierung entweder Equals
oder GetHashCode
haben Sie etwas zu schreiben für die andere Methode, um sicherzustellen, die Logik, die ich oben erklärt, bleibt sich treu.Visual Studio hilft dabei jetzt docs.microsoft.com/en-us/visualstudio/ide/reference/...
InformationsquelleAutor rene | 2012-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, ich glaube, Sie verstehen, wo immer Sie implementieren
Equals
MÜSSEN Sie auch umsetzenGetHashCode
. Die Umsetzung derGetHashCode
muss spiegeln das Verhalten derEquals
Umsetzung aber in der Regel nicht verwenden.Sehen http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx - vor allem der "Notizen der Entwickler"
So, wenn Sie nehmen Ihr Beispiel von der
Item
Umsetzung vonEquals
Sie erwägen, sowohl die Werte derid
undname
zu beeinflussen Gleichheit. Also beide dazu beitragen müssen, dieGetHashCode
Umsetzung.Ein Beispiel, wie Sie implementieren können
GetHashCode
fürItem
wäre entlang der Linien der folgenden (Hinweis: Sie müssen möglicherweise um es belastbar zu eine null -name
Feld):Sehen, Eric Lippert ' s blog-post über Leitlinien für
GetHashCode
- http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/Als ob Sie brauchen, um neu zu implementieren
GetHashCode
im Unterklassen - ja, wenn Sie auch außer Kraft setzenEquals
- nach den ersten (und wichtigsten) Punkt - die Umsetzung der beiden muss konsistent sein - wenn zwei Elemente als gleich betrachtet werden, durchEquals
dann müssen Sie den gleichen Wert zurückgeben vonGetHashCode
.Seite beachten:
Als performance-Verbesserung die auf Ihrem code (vermeiden Sie mehrere wirft):
order
Klasse,es hat nur eine id und eine Liste kann ich nicht alle Werte in der Liste aus, um einen hashcode.Ein List-Objekt hat eine
GetHashCode
Umsetzung, die möglicherweise für Ihre Zwecke ausreichend. Da die Liste betrifft die Gleichheit, die Sie HABEN zu prüfen, es in dieGetHashCode
Umsetzung. Aber wenn Sie wieder IhreEquals
Umsetzung, Sie sind mit Ihnen in einem hierarchischen Sinn - wenn die ids übereinstimmen, dann sind die Objekte gleich sind, ungeachtet Ihrer Bezeichnung Werte. Also dieGetHashCode
Umsetzung würde müssen anders mein ersten Vorschlag; ich habe nicht herausgefunden, wie, aber... (noch)Wenn das, was Sie tun, Entspricht dann ja, das ist genau das, was Sie tun müssen.
Die Liste ist GetHashCode wird basierend auf die Referenz der Liste, nicht seinen Inhalt. Zwei verschiedene Listen mit identischen Einzelteile nicht unbedingt den gleichen hash-code. Nun, wenn Sie definiert sich für die Gleichstellung Aufträge werden nur auf der Grundlage der Bestellung code, und nicht auf die Gegenstände, dann sind diese Probleme Weg. Die können Gleich vergleichen Sie einfach die Bestellnummer und die getHashCode-kann nur wieder den hash-code der Bestell-code. Wenn Sie das Programm muss unterstützen, dass Sie über zwei verschiedene Bestellungen mit der gleichen Bestellnummer und die verschiedenen Elemente, die Sie dann benutzen müssen, um jedes Element in der Liste in beide equals und GetHashCode.
Das ist, was ich dachte (war zu spielen mit einem proof-of-concept). Die grundlegende Frage ist,
GetHashCode
ist angeblich sehr schnell ausgewertet, so dass die Iteration aller Elemente in einer Liste klingt nicht wie eine gute Idee; aber wenn Ihr Teil von dem test für die Gleichheit, die Sie hat enthalten sein.InformationsquelleAutor kaj
Ich lieber Josh Bloch ' s Herangehensweise.
Hier ist das Beispiel für die
Param
Klasse.Überprüfen Sie auch diesen link aus : .net - best-Algorithmus für GetHashCode
Eigenschaften, die für die hashcode-Berechnung sollte unveränderlich sowie.
InformationsquelleAutor Alex