Instanzen auf inahlt vergleichen???
-
Jihhhaaa schrieb:
equals vergleich ja nur die referenz nicht den inhalt....
Das ist so nur halb richtig.
Das Equals der Klasse Object vergleicht nur die Referenzen. Es ist aber Dir selbst überlassen in Deiner Klasse Equals zu überschreiben und einen beliebigen Vergleich einzubauen.
-
Dann implementier ich lieber das IEquatable interface oder, satt Equals zu überschreiben?
-
Da hab ich noch ne weitere frage:
auf welcher basis vergleicht Dictionary<TKey,TVal> wenn ich "ContansKey(TKey)" aufrufe... welche methode /Interface müsste ich bei "Foo" implementieren, damit die ContainsKey nach meinen regeln verlgeicht???
-
ich kann mir denken das der standard vergleich auf dem ToString beruht
es muesste reichen das IComparable<T> zu implementieren
-
auf welcher basis vergleicht Dictionary<TKey,TVal> wenn ich "ContansKey(TKey)" aufrufe... welche methode /Interface müsste ich bei "Foo" implementieren, damit die ContainsKey nach meinen regeln verlgeicht???
Soweit ich weiß,müsstest du IDictionary<TKey,TValue> implementieren.
Schau mal hier: http://msdn.microsoft.com/en-us/library/kw5aaea4.aspx
und dann bei "Implements" schauen
-
Dictionary<TKey, TValue> vergleicht die Key mit Equals(..).
Also einfach das überschreiben.
Simon
-
das IDictionary<TKey, TVal> braucht er doch nur wenn er ein eigenes dictionary bauen will
aber wenn er nur items als keys hinzu fuegen will muessen nur diese items vergleichbar sein - und das passiert mit IComparable<T>
-
Achso, dann hab ich das falsch aus seinem Letzten Post interpretiert, aber das mit IComparable hab ich ja schon in meinem ersten Post gesagt,warum keiner auf mich hört :p:D
-
dir hoert eh keiner zu - is doch nix neues #ggg
-
Es sollte vllt erstmal geklärt werden was der Op unter Gleichheit vesteht. IComparable<T> ist zum Sortieren von Elementen gedacht die in einer Sortierreihenfolge den gleichen Sortierwert bestzen. Wenn beispielsweise Strings ohne Berücksichtigung der Groß/Kleinschreibung sortiert werden sollen sind "AbC" und "aBC" aus der Sicht von IComparable<T> gleich, aber um zu prüfen ob sie denselben Inhalt besitzen sind sie (IEquatable<T>) ungleich.
Wenn der OP einfach nur zwei Instanzen prüfen will sollte IEquatable verwendet werden.
-
@witte: Du hast es auf den punkt gebraucht.. dann nehm das IEquatable<Foo> die "WEquals" Methode implementiert;)
-
Neine es geht nicht!!! Hab folgendes Probiert:
Die Klasse als Dictionary Key:class Elem //: IEquatable<Elem> { public Elem(string name) { Name = name; } public string Name { get; private set; } #region IEquatable<Elem> Member public override bool Equals(object obj) { return Name.Equals((obj as Elem).Name); //return base.Equals(obj); } //override public bool Equals(Elem other) //{ // return Name.Equals(other.Name); //} #endregion }
TEST;:
Dictionary<Elem,int> hash = new Dictionary<Elem,int>(); hash.Add(new Elem("A"),1); bool g1 = hash.ContainsKey(new Elem("A")); //ist false(solte true sein) hash.Add(new Elem("B"), 2); //Ein objekt mit dem gleichen name kann auch angefügt werden!! hash.Add(new Elem("A"), 3);
Egal ob ich IEquatable implementiere oder "Equal" überschreibe, werden die
methoden nich als vergleichs basis für die Dictionary verwendet!!!!
-
Hmm...ich hab mir das mal genau im .net Reflector angesehen. Und so wie es aussieht, implementiert Dictionary zum vergleichen und zum suchen von Elementen mit
ContainsKey
dasIEqualityComparer<T>
Interface
-
mit dem IEqualityComparer<T> gehts auch nich:
#endregion #region IEqualityComparer<Elem> Member public bool Equals(Elem x, Elem y) { return x.Name == y.Name; } public int GetHashCode(Elem obj) { return obj.Name.GetHashCode(); } #endregion
-
Hast du die Klasse, die das IEqualityComparer-Interface implementiert, beim Konstruktor des Dictionary übergeben?
-
hmm muss man den noch expilzit angeben??? wie mach ich das???
-
class ElemEqualityComparer : IEqualityComparer<Elem> { #region IEqualityComparer<Elem> Member public bool Equals(Elem x, Elem y) { return x.Name == y.Name; } public int GetHashCode(Elem obj) { return obj.Name.GetHashCode(); } #endregion } class Elem { public Elem(string name) { Name = name; } public string Name { get; private set; } }
Init:
Dictionary<Elem, int> hash = new Dictionary<Elem, int>(new ElemEqualityComparer());
JETZT GEHST DANKE;)