将Double类型用作键的最佳集合

本文关键字:最佳 集合 Double 类型 | 更新日期: 2023-09-27 18:23:58

我有这个对象:

Public Cactus{
    Public Double key;
    Public String value;
}

我有大约100个Cactus,它们都有一个唯一的键和一个有一些重复的值。然而,我将不得不检索一个密钥的值大约2000次。我的Key值在-10和280之间变化。

我希望这个过程尽可能快。对此,最好的方法是什么?我一直在考虑使用HashTable,尽管我总是使用Integer而不是Double,出于某种原因,我担心将Double用作Key不是一个好的做法。

在我的场景中,哪个集合最适合使用?

将Double类型用作键的最佳集合

在字典中使用双精度作为键通常是个糟糕的主意。你会遇到各种表示错误的问题,你认为你在字典中存储了0.1,但实际上你存储了非常接近但不完全等于0.1的东西。

如果您需要完全匹配,我建议使用另一种类型(字符串?)。

如果你不想精确匹配,只想找到最接近的值,可以考虑像SortedList这样的东西。

是的,使用双值作为键似乎很尴尬。这些双值是某些计算的结果吗?这些计算可能有一些非常小的舍入误差?如果要计算这些值并使用这些计算值访问集合,则很可能会出现不需要的结果。

例如,存储一个键值为1.01的元素。您的计算结果将为1.010000000000000123,并且与存储的密钥不匹配。

如果不是这样,那么我认为使用双值作为字典或哈希表集合的键没有问题。

顺便说一句,使用类型化字典(即Dictionary<double, string>)将比使用HashTable更容易使用。

我同意@Mark Byers和@tafa的观点,即直接使用double作为键是个坏主意。如果你想确保你有完全相同的数字,你可以根据组成双的字节构建一个字符串键。下面的结构将一个double映射到与8字节相同的内存空间,因此不需要自定义转换。

[StructLayout(LayoutKind.Explicit)]
public struct TestStruct
{
    [FieldOffset(0)]
    public byte byte1;
    [FieldOffset(1)]
    public byte byte2;
    [FieldOffset(2)]
    public byte byte3;
    [FieldOffset(3)]
    public byte byte4;
    [FieldOffset(4)]
    public byte byte5;
    [FieldOffset(5)]
    public byte byte6;
    [FieldOffset(6)]
    public byte byte7;
    [FieldOffset(7)]
    public byte byte8;
    [FieldOffset(0)]
    public double double1;
}

然后,它可以封装在这样的函数中(假设您在类中将结构定义为私有变量)

static string GetStringKey(double key)
{
    _conversionStruct.double1 = Double.MaxValue;
    return String.Format("{0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}", 
        _conversionStruct.byte1,
        _conversionStruct.byte2, 
        _conversionStruct.byte3, 
        _conversionStruct.byte4, 
        _conversionStruct.byte5,
        _conversionStruct.byte6, 
        _conversionStruct.byte7, 
        _conversionStruct.byte8);
}

而且是这样使用的。

var s1 = GetStringKey(double.MaxValue);
var s2 = GetStringKey(double.MinValue);

它给出了。。。

s1="255:255:255:255:255:255:239:127" 
s2="255:255:255:255:255:255:239:255"
  • 如果可以的话,把双音变成长音,并用它作为键。(乘以10的倍数去掉小数点)
  • 另一个不如第一个好的选项是将double转换为字符串