получить значение из хеш-таблицы с помощью клона ключа; C # - PullRequest
3 голосов
/ 18 марта 2010

Я хотел бы знать, есть ли какой-нибудь возможный способ извлечь элемент из хеш-таблицы, используя ключ, идентичный фактическому ключу, но другой объект. Я понимаю, почему это, вероятно, невозможно, но я хотел бы посмотреть, есть ли хитрый способ сделать это.

Моя проблема возникает из-за того, что, будучи таким же глупым, как я, я создал хеш-таблицы с int [] в качестве ключей, с целочисленными массивами, содержащими индексы, представляющие пространственную позицию. Я каким-то образом знал, что мне нужно создавать новый тип int [] каждый раз, когда я хотел добавить новую запись, но забыл подумать, что когда я буду генерировать массивы пространственных координат позже, они будут бесполезны при получении значений из моих хеш-таблиц.

Теперь я пытаюсь решить, следует ли изменить порядок вещей, чтобы я мог сохранять свои значения в ArrayLists, или искать в списке ключей в Hashtable тот, который мне нужен каждый раз, когда я хочу получить значение, ни из вариантов очень круто.

Если конечно нет способа заставить // 1 работать как // 2!

Заранее спасибо.

 static void Main(string[] args)
        {
            Hashtable dog = new Hashtable();

            //1
            int[] man = new int[] { 5 };
            dog.Add(man, "hello");
            int[] cat = new int[] { 5 };
            Console.WriteLine(dog.ContainsKey(cat)); //false


            //2
            int boy = 5;
            dog.Add(boy, "wtf");
            int kitten = 5;
            Console.WriteLine(dog.ContainsKey(kitten)); //true;


        }

1 Ответ

8 голосов
/ 18 марта 2010

Да, у вас есть два варианта.

  1. Реализация Equals() и GetHashCode() в ключевых классах.

  2. Создайте пользовательский IEqualityComparer и передайте его конструктору Hashtable.

Вы захотите реализовать Equals() и GetHashCode() самостоятельно, когда реализации имеют смысл для всех случаев использования вашего пользовательского класса. Если они подходят только иногда, тогда используйте пользовательский IEqualityComparer, который имеет те же функции, но предоставляет его отдельно от самого класса. Этот второй параметр также позволяет предоставлять пользовательские правила для классов нестандартных ключей.

...