C#数组字典

C#数组字典,c#,dictionary,C#,Dictionary,我可以在数组之类的类上使用C#字典吗 Dictionary<double[],double[]> 字典 恐怕它无法判断数组何时相等 编辑: 字典中的哈希方法会很好地处理数组吗?或者只是散列它们的引用?对于数组键,字典将使用引用进行散列和相等,这可能不是您想要的。这给您留下了两个选择:为double[]实现一个包装类,或者(更好)编写实现IEqualityComparer的东西,并将其传递给字典构造函数。只比较数组引用。在以下示例中,即使数组a和b具有相同的条目数且条目值相等,字典

我可以在数组之类的类上使用C#字典吗

Dictionary<double[],double[]>
字典
恐怕它无法判断数组何时相等

编辑:

字典中的哈希方法会很好地处理数组吗?或者只是散列它们的引用?

对于数组键,字典将使用引用进行散列和相等,这可能不是您想要的。这给您留下了两个选择:为
double[]
实现一个包装类,或者(更好)编写实现
IEqualityComparer
的东西,并将其传递给
字典
构造函数。

只比较数组引用。在以下示例中,即使数组a和b具有相同的条目数且条目值相等,字典也将有2个条目:

double[] a = new[] { 1.0, 2.1, 3.2 };
double[] b = new[] { 1.0, 2.1, 3.2 };

Dictionary<double[], double[]> d = new Dictionary<double[], double[]>();

d[a] = new [] { 1.1 };
d[b] = new [] { 2.2 };

Console.WriteLine(d.Count);
Console.WriteLine(d[b][0]);
double[]a=new[]{1.0,2.1,3.2};
double[]b=新[]{1.0,2.1,3.2};
字典d=新字典();
d[a]=新[]{1.1};
d[b]=新[]{2.2};
控制台写入线(d.Count);
Console.WriteLine(d[b][0]);

我认为使用数组作为键不是一个好主意,特别是如果它很大,并且您的相等逻辑基于数组的内容时。因为每次调用
GetHashCode
,它都必须对整个数组执行计算,如果数组很大,这可能需要一些时间

一种解决方案是将数组包装在一个类中,该类将存储哈希代码,直到修改数据,这样就不会每次都重新计算:

class ArrayWrapper<T>
{
    private T[] _array;
    public ArrayWrapper(T[] array)
    {
        _array = array;
    }

    private int? _hashcode;
    public override int GetHashCode()
    {
        if (!_hashcode.HasValue)
        {
            _hashcode = ComputeHashCode();
        }
        return _hashcode.Value;
    }

    public override bool Equals(object other)
    {
        // Your equality logic here
    }

    protected virtual int ComputeHashCode()
    {
        // Your hashcode logic here
    }

    public int Length
    {
        get { return _array.Length; }
    }

    public T this[int index]
    {
        get { return _array[index]; }
        set
        {
            _array[index] = value;
            // Invalidate the hashcode when data is modified
            _hashcode = null;
        }
    }
}
类阵列振打器
{
专用T[]_数组;
公共阵列振打器(T[]阵列)
{
_数组=数组;
}
私有int?\u哈希代码;
公共覆盖int GetHashCode()
{
if(!\u hashcode.HasValue)
{
_hashcode=ComputeHashCode();
}
返回_hashcode.Value;
}
公共覆盖布尔等于(对象其他)
{
//你的平等逻辑在这里
}
受保护的虚拟int ComputeHashCode()
{
//您的哈希代码逻辑在这里
}
公共整数长度
{
获取{return\u array.Length;}
}
公共T此[int索引]
{
获取{返回_数组[索引];}
设置
{
_数组[索引]=值;
//修改数据时使哈希代码无效
_hashcode=null;
}
}
}

所以你的字典应该是
字典
。当然,您可能希望向包装器添加一些方法或属性(例如,实现
IList

如果您能满足我的好奇心,将密钥设置为数组的业务需求是什么?我正在收集分类问题中的输入-输出对(大维度),在训练分类器之前,以某种方式对重复对进行平均…@BlueRaja,
列表
是否对其内容进行相等比较和散列?我不这么认为。