Instanzen auf inahlt vergleichen???



  • 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 das IEqualityComparer<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;)


Anmelden zum Antworten