Laden...

Equals einer Klasse überschrieben, wie auf List<T>-Gleichheit prüfen?

Erstellt von Powerslave vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.702 Views
P
Powerslave Themenstarter:in
554 Beiträge seit 2005
vor 13 Jahren
Equals einer Klasse überschrieben, wie auf List<T>-Gleichheit prüfen?

Guten Morgen,

es geht um folgende Klasse:


    public class ClientGroup : DomainObject
    {
        public string Name { get; set; }
        public UniqueList<Client> Clients { get; private set; }

        public ClientGroup( string name )
        {
            Name = name;
            Clients = new UniqueList<Client>();
        }

        public override bool Equals( object obj )
        {
            if( base.Equals( obj ) ) // Hier wird DomainObject.Equals() aufgerufen, die einen Typ-Vergleich macht
            {
                if( ReferenceEquals( this, obj ) )
                {
                    return true;
                }

                ClientGroup clientGroup = obj as ClientGroup;

                return Name.Equals( clientGroup.Name ) && ... // Was nun?
            }

            return false;
        }

        public override int GetHashCode()
        {
            // Und hier?
            return Name.GetHashCode() ^ Clients.Count;
        }
    }

Ich möchte gerne den Namen sowie die Listenelemente vergleichen.
Wenn ich aber Clients.Equals(clientGroup.Clients) prüfe, wird ja object.Equals() und damit nur ReferenceEquals aufgerufen, aber KEIN Wertevergleich der Listenelemente.

Hat jemand von euch eine Idee wie man auf Gleichheit der Listenelemente prüft?
Sonst müsste ich mir ne Helper-Methode schreiben, was ich in diesem Fall eigentlich umgehen möchte.

PS: Wer oberes gelöst hat, darf mir auch gleich noch verraten, wie man dazu noch GetHashCode implementiert 😉

Dankeschön!

Achtung! - Hinter dir ist ein dreiköpfiger Affe!

M
334 Beiträge seit 2007
vor 13 Jahren

Du musst wohl oder übel jedes einzelne Element vergleichen.
Es gibt dazu in System.Linq die SequenceEquals()-Methode, die aber nur eine Ebene tief vergleicht.

Falls dir das nicht ausreicht, hier eine Implementierung die auch verschachtelte Listen verkraftet:


        private static bool EnumerableEquals(IEnumerable first, IEnumerable second)
        {
            IEnumerator enumFirst = first.GetEnumerator();
            IEnumerator enumSecond = second.GetEnumerator();
            
            while (enumFirst.MoveNext())
            {
                if (!enumSecond.MoveNext()) return false;
                var currentFirst = enumFirst.Current;
                var currentSecond = enumSecond.Current;
                if (currentFirst is IEnumerable && currentSecond is IEnumerable)
                    return EnumerableEquals(currentFirst as IEnumerable, currentSecond as IEnumerable);
                
                return currentFirst.Equals(currentSecond);
            }
            return !enumSecond.MoveNext();
        }

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

zur Implementierung von von GetHashCode liefert die Doku umfangreiche Informationen: Object.GetHashCode-Methode, Abschnitt Hinweise.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca