gpt4 book ai didi

c# - 避免在HashSet 中重复以获取略有不同的值

转载 作者:行者123 更新时间:2023-12-03 16:15:25 28 4
gpt4 key购买 nike

我正在尝试跳过以下值列表的重复项。我想要达到的结果是-112.94487230674, -49.47838592529, -89.9999574979198,我正在使用HashSet类。我已经实现了下面的IEqualityComparer,但是它不起作用。
我究竟做错了什么?

    class HeightEqualityComparer : IEqualityComparer<double>
{
public bool Equals(double a, double b)
{
return a - b < 1e-3;
}

public int GetHashCode(double value)
{
return value.GetHashCode();
}
}
以下是值列表:
    [0] -112.94487230674    double
[1] -112.94487230674001 double
[2] -49.478385925290006 double
[3] -49.47838592529 double
[4] -49.478385925289992 double
[5] -89.9999574979198 double
[6] -89.99995749791978 double
[7] -49.478385925289984 double
[8] -89.999957497919809 double
[9] -49.478385925290013 double

最佳答案

好吧,当前实现的Equals

   return a - b < 1e-3;
是不正确的。 Equals必须为
  • Equals(a, a) == true;
  • 对称:Equals(a, b) == Equals(b, a);
  • 传递性Equals(a, b) && Equals(b, c)导致Equals(a, c)

  • 当前实现中不包含条件 23。修复第二种情况很容易
    Math.Abs的帮助下;第三个是真正的困难:对于任意正 tolerance(在您的情况下为 1e-3),我们有
       a == a + tolerance == a + 2 * tolerance == ... == a + n * tolerance  
    意思是
       a == a + n * tolerance
    用于任意大 n;因此,所有 a == bab(所有数字均相等)。
    作为部分(但有效)的解决方案,您可以尝试舍入值:
       class HeightEqualityComparer : IEqualityComparer<double>
    {
    public bool Equals(double a, double b)
    {
    return Math.Round(a, 3) == Math.Round(b, 3);
    }

    public int GetHashCode(double value)
    {
    return Math.Round(value, 3).GetHashCode();
    }
    }
    注意,我们必须更改 GetHashCode

    关于c# - 避免在HashSet <double>中重复以获取略有不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62652062/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com