Словарь C# массивов

Я могу использовать Словарь C# по классам как массивы??

Dictionary<double[],double[]>

Я боюсь, что это не сможет сказать, когда массивы будут равны...

Править:
Будет метод хеширования в словаре проявлять хорошо заботу за массивами? или просто хешировав их ссылки?

5
задан Betamoo 25 May 2010 в 20:28
поделиться

3 ответа

Для ключей массива словарь будет использовать ссылки для хеширования и равенства, что, вероятно, не то, что вам нужно. Это оставляет вам два варианта: реализовать класс-оболочку для double [] или (лучше) написать что-нибудь, реализующее IEqualityComparer , и передать его в Dictionary конструктор.

5
ответ дан 14 December 2019 в 04:31
поделиться

Сравниваются только ссылки на массивы. В следующем примере в словаре будет 2 записей, хотя массивы a и b имеют одинаковое количество записей и значения записей равны:

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]);
3
ответ дан 14 December 2019 в 04:31
поделиться

Я не думаю, что иметь массив в качестве ключа - хорошая идея, особенно если он большой и если ваша логика равенства основана на содержимом массива. Потому что каждый раз, когда вы будете вызывать 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;
        }
    }
}

Таким образом, ваш словарь будет Dictionary, ArrayWrapper>. Конечно, вы можете захотеть добавить некоторые методы или свойства к обертке (например, реализовать IList)

0
ответ дан 14 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: