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!
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();
}
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