2010-05-06 73 views
4

我有一個IPEndPoint a和b,其IPAddress和Port是完全一樣的,但是==運算符在IPEndPoint上沒有返回true。爲了讓事情變得更加陌生,我試圖通過簡單地比較IP地址和端口來避開這個問題,但它仍然沒有返回true。IPEndPoint對象不能正常工作的比較

有沒有人遇到過這個?如果是這樣的話,我非常喜歡高性能的解決方案。我們收集了多達10k個IPEndPoints,並通過LINQ(PLINQ很快)查詢它們。

+0

我還沒有嘗試過這個,但檢查這個[後](http://stackoverflow.com/questions/1016471/how-to-compare-ip-addresses)。 – gooch 2010-05-06 17:17:21

回答

6

兩個IPEndPointIPAddress沒有實現==操作符。默認情況下,==運算符會比較兩個對象是否是相同的引用,而不是它們表示相同的值。

使用IPAddress.Equals/IPEndPoint.Equals方法,而不是。

+0

這是有效的。但是,我認爲如果我正在檢查實際參考,我會使用Object.ReferenceEquals();謝謝。 – 2010-05-06 17:33:19

2

ip地址沒有定義==但它覆蓋的Object.Equals超載,所以你的平等檢查應該是:

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

如果您正在使用LINQ,它可能是一個好主意,以創建擁有IEqualityComparer<IPEndpoint>來封裝這個,因爲各種linq方法需要一個來比較項目。

+0

IPEndPoint也覆蓋Object.Equals。 – dtb 2010-05-06 17:23:13

+1

此代碼是不必要的,因爲[IPEndPoint.Equals()方法](http://msdn.microsoft.com/en-us/library/k7a45x6z.aspx)已經實現了同一校驗: '公共覆蓋布爾等於(對象比較數) {return comparand is IPEndPoint &&((IPEndPoint)comparand).m_Address.Equals(this.m_Address)&&((IPEndPoint)comparand).m_Port == this.m_Port; }' – virious 2014-07-14 13:49:37