Instanzen auf inahlt vergleichen???
-
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;)