【问题标题】:Comparison of IPEndPoint objects not workingIPEndPoint 对象的比较不起作用
【发布时间】:2010-05-06 17:09:49
【问题描述】:

我有一个 IPEndPoint a 和 b,它们的 IPAddress 和 Port 完全相同,但是 == 运算符位于 IPEndPoint 上,没有返回 true。为了让事情变得更奇怪,我试图通过简单地单独比较 IPAddress 和 Port 来规避这个问题,但它仍然没有返回 true。

有没有人遇到过这种情况?如果是这样,我全神贯注于高性能解决方案。我们拥有多达 10k 个 IPEndPoints 的集合,并正在通过 LINQ 查询它们(PLINQ 很快)。

【问题讨论】:

  • 我没试过这个,但是检查一下这个 SO post.

标签: c#


【解决方案1】:

IPEndPointIPAddress 都没有实现 == 运算符。默认情况下,== 运算符比较两个对象是否是相同的引用,而不是它们表示相同的值。

改用IPAddress.Equals / IPEndPoint.Equals 方法。

【讨论】:

  • 那行得通。但是,我认为如果要检查实际参考,我会使用 Object.ReferenceEquals();谢谢。
【解决方案2】:

IPAddress 没有为 == 定义重载,但它确实覆盖了 Object.Equals,因此您的相等性检查应该是:

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

如果您使用 linq,最好创建自己的 IEqualityComparer<IPEndpoint> 来封装它,因为各种 linq 方法需要一个来比较项目。

【讨论】:

  • IPEndPoint 也会覆盖 Object.Equals。
  • 此代码是不必要的,因为IPEndPoint.Equals() Method 已经实现了相同的检查:public override bool Equals(object comparand) { return comparand is IPEndPoint && ((IPEndPoint)comparand).m_Address.Equals(this.m_Address) && ((IPEndPoint)comparand).m_Port == this.m_Port; }
【解决方案3】:

你可以比较HashCodes...

IPEndPoint a = ....
IPEndPoint b = ....

if(a.GetHashCode() == b.GetHashCode()){
...
}

有效^^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2011-10-29
    • 2021-08-05
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多