Probleme mit Except-Erweiterungsmethode

23/09/2008 - 12:13 von Andreas Bürstner | Report spam
Hallo zusammen,
ich habe ein Problem damit wie die einzelnen Elemente beim Aufruf der
Except-Erweiteungsmethode miteinander verglichen werden.
Ich habe ein Klasse
public class Contact:IEquatable<Contact>
{
public Guid ContactId {get;set;}

public override bool Equals(object obj)
{
if (obj == null) return false;
Contact c = obj as Contact;
if (c == null) return false;
return this.ContactId == c.ContactId;
}

public bool Equals(Contact other)
{
if (other == null) return false;
return this.ContactId == other.ContactId;
}
}

Es existieren zwei Arrays dieser Klasse mit jeweils einer Instanz die beide
die gleiche Id besitzen.
Guid id = Guid.NewGuid();
Contact[] ar1 = new Contact[]{new Contact(){ContactId=Id}};
Contact[] ar2 = new Contact[]{new Contact(){ContactId=Id}};
Die Erzeugung der Arrays sei hier nur beispilehaft.

Wenn ich nun

var contacts= ar1.Except(ar2);
bzw.
var contacts= ar1.Except(ar2,EqualityComparer<Contact>.Default);
auffrufe, so dachte ich, daß die zurückgegebene Auflistung leer sein müßte.
Sie enthaàlt allerdings das Contact-Objekt aus ar1. Wo ligt hier mein Fehler.
Warum wird nicht die Equals-Methode benutzt, die ich definiert habe.
Auch der Versuch das Ganze mit einem eigenen IEqualityComparer zu lösen,
brachte nicht den gewünschten Erfolg.

Danke für eure Hilfe

Andreas
 

Lesen sie die antworten

#1 Frank Dzaebel
24/09/2008 - 08:09 | Warnen spam
Hallo Andreas,

ich habe ein Problem damit wie die einzelnen Elemente beim Aufruf der
Except-Erweiteungsmethode miteinander verglichen werden.



Ja, gut, Du hast GetHashCode nicht überschrieben,
aber daran liegt wahrscheinlich nicht.

[Feedback: IEnumerable<T>.Intersect, Union, Distinct, Except return
incorrect results with class that implements IEquatable<>]
https://connect.microsoft.com/Visua...ackID24047

[IEnumerable<T>.Intersect() not calling my object's IEquatable<T>.Equals()?]
http://groups.google.com/group/micr...db496694cc

Woraround ggf. vorerst eigene Erweiterungsmethode,
die das Standardverhalten dann überschreibt
(dann bràuchtest Du auch nur "Equals(Contact other)" überschreiben):


static class MyExtensions
{
public static IEnumerable<TSource> Except<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second)
{
Debugger.Break(); // TODO!
throw new NotImplementedException();
}
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen