小编Roc*_*oci的帖子

如何使用 float 作为 C# 字典中的键,并使用舍入到最接近的 0.01 的自定义比较器?

我希望实现一个 IEqualityComparer 类,用于存储和比较四舍五入到最接近的 0.01 的浮点键。特别是,我想确保正确实现 GetHashCode 方法。我想让这尽可能高效。我可以只使用浮点值本身作为它自己的哈希值吗?

我可以乘以 100,转换为 int 并使用 int 作为键,但我很好奇是否可以使用 float 键来完成此操作。

注意:我会将字典包装在一个类中,以确保只添加或比较四舍五入到 0.01 的值。

后续问题:如果我使用 Decimal(保证始终四舍五入为 0.01),我可以仅使用 Decimal 与字典中的 Decimal 键的默认比较器吗?

我的第一个想法是尝试这个实现。有什么陷阱吗?

class FloatEqualityComparer : IEqualityComparer<float>
{
    public bool Equals(float b1, float b2)
    {
        int i1 = (int)(b1 * 100);
        int i2 = (int)(b2 * 100);
        if(i1 == i2)
            return true;
        else
            return false;
    }

    public float GetHashCode(float x)
    {
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# dictionary hashtable iequalitycomparer

3
推荐指数
1
解决办法
3259
查看次数

在运行时初始化抽象类中的静态字段

我需要初始化一个将从类的许多实例访问的字段.初始化需要一些计算,并且将有数百万个实例,因此我需要初始化仅发生一次,并且要在所有实例之间共享变量以节省内存.最后,我想在抽象类中实现这一点.

如何初始化运行时my_val计算的静态变量CalculateMyVal()

abstract class MyAbstract
{
    static readonly int my_val;
    int CalculateMyVal()
    {
        int x = 1;
        // Long Calculation on x
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

c#

2
推荐指数
1
解决办法
79
查看次数

具有空setter的属性是否会占用内存空间?

在下面的三个属性中,BarProp每个类实例只需要4个字节的内存吗?

class Foo
{
    int BarEmptySet { get { return 0; } set { } }
    int BarNoSet { get { return 0; } }
    int BarProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

c#

1
推荐指数
1
解决办法
259
查看次数

标签 统计

c# ×3

dictionary ×1

hashtable ×1

iequalitycomparer ×1