2010-05-06 7 views
4

J'ai un IPEndPoint a et b, dont IPAddress et Port sont exactement les mêmes, mais l'opérateur == est sur IPEndPoint ne retourne pas vrai. Pour rendre les choses encore plus étranges, j'ai essayé de contourner le problème en comparant simplement l'IPAddress et le port individuellement et il ne retourne TOUJOURS pas vrai.La comparaison des objets IPEndPoint ne fonctionne pas

Est-ce que quelqu'un a déjà rencontré ça? Si c'est le cas, je suis à l'écoute de solutions performantes. Nous avons des collections d'IPEndPoints jusqu'à 10k et nous les interrogeons via LINQ (bientôt PLINQ).

+0

Je n'ai pas essayé ceci, mais vérifiez ceci SO [post] (http://stackoverflow.com/questions/1016471/how-to-compare-ip-addresses). – gooch

Répondre

6

Les deux IPEndPoint et IPAddress n'implémentent pas l'opérateur ==. Par défaut, l'opérateur == compare si les deux objets sont la même référence, et non s'ils représentent la même valeur. Utilisez plutôt les méthodes IPAddress.Equals/IPEndPoint.Equals.

+0

Cela fonctionne. Cependant, je pensais que si je vérifiais la référence réelle, j'utiliserais Object.ReferenceEquals(); Merci. –

2

IPAddress ne définit pas une surcharge pour == mais il ne remplace Object.Equals, de sorte que votre chèque d'égalité doit être:

public static bool AreEqual(IPEndpoint e1, IPEndpoint e2) 
{ 
    return e1.Port == e2.Port && e1.Address.Equals(e2.Address); 
} 

Si vous utilisez LINQ, il est probablement une bonne idée de créer votre propre IEqualityComparer<IPEndpoint> pour encapsuler ceci, puisque diverses méthodes de linq prennent un pour comparer des articles.

+0

IPEndPoint remplace également Object.Equals. – dtb

+1

Ce code est inutile car [IPEndPoint.Equals() Method] (http://msdn.microsoft.com/en-us/library/k7a45x6z.aspx) implémente déjà la même vérification: 'public override bool Equals (objet comparand {return comparand est IPEndPoint && ((IPEndPoint) comparand) .m_Address.Equals (this.m_Address) && ((IPEndPoint) comparand) .m_Port == this.m_Port; } ' – virious

Questions connexes