将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
不是一个好的做法。
在我的场景中,哪个集合最适合使用?
在字典中使用双精度作为键通常是个糟糕的主意。你会遇到各种表示错误的问题,你认为你在字典中存储了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转换为字符串