与Double类型一起使用的最佳集合

时间:2012-02-10 15:41:59

标签: c# collections

我有这个对象:

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

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

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

根据我的情况,哪个系列最适合使用?

4 个答案:

答案 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)

  • 如果可以,请将双倍长,并将其用作关键。 (乘以10的倍数以除去小数点)
  • 另一个选项,不如第一个选项,是将double转换为字符串。