我有这个对象:
Public Cactus{
Public Double key;
Public String value;
}
我有大约100 Cactus
,它们都有一个唯一的密钥,并且有一些重复的值。
然而,我将必须检索约2000次的密钥值。
我的Key
值在-10到280之间变化。
我希望这个过程尽可能快。对此最好的方法是什么?我在考虑使用HashTable
,虽然我总是使用Integer
而不是Double
,但出于某种原因,我担心使用Double
作为一个好习惯Key
。
根据我的情况,哪个系列最适合使用?
答案 0 :(得分:10)
在字典中使用double作为键通常是一个非常糟糕的主意。如果您认为在字典中存储了0.1,但实际存储的内容非常接近但不等于0.1,您将遇到各种表示错误的问题。
如果您需要完全匹配,我建议使用其他类型(字符串?)。
如果您不想要完全匹配但只想找到最接近的值,请考虑使用SortedList。
答案 1 :(得分:2)
是的,使用双值作为键似乎很尴尬。 某些计算的双值结果是否可能有一些非常小的舍入误差? 如果您要计算这些值并使用这些计算值访问集合,很可能会产生不需要的结果。
例如,您存储键值为1.01的元素。 您的计算结果为1.010000000000000123,与存储的密钥不匹配。
如果不是这种情况,那么我认为使用double值作为字典或哈希表集合的键是没有问题的。
BTW,使用键入的词典(即Dictionary<double, string>
)比HashTable
更容易使用。
答案 2 :(得分:2)
我同意@Mark Byers和@tafa直接使用double作为键是一个坏主意。如果要确保具有完全相同的数字,可以根据构成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"
答案 3 :(得分:0)