Хобрук: Ваш путь к мастерству в программировании

Переопределение ключа словаря С# не находит ключ

Я пытаюсь выполнить поиск по словарю с помощью TryGetValue, используя объект в качестве ключа. Я переопределил GetHashCode, который, по моему мнению, был необходим для установки способа генерации ключа для словаря. Приведенный ниже класс Item является ключом для словаря.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class Item : MonoBehaviour
{
   int id;
   string name;
   string itemType;

   public Item(string name, int id, string itemType)
   {
       this.name = name;
       this.id = id;
       this.itemType = itemType;
   }
   public override bool Equals(object obj)
   {
       if (obj == null)
        return false;
       Item myItem = (Item)obj;
       if (myItem == null)
        return false;

       return (name == myItem.name) && (itemType == myItem.itemType);
   }
   public override int GetHashCode()
   {        
       return (this.name + this.itemType).GetHashCode();
   } 
      [...]
   }

Из другого класса я использую «TryGetValue (Item, GameObject)», чтобы увидеть, существует ли элемент в словаре, но даже если в словаре есть несколько элементов с одинаковым именем и типом элемента, он не находит ключ.

public void UIItemCreate(Item item, GameObject itemGameObject)
{
    GameObject go = null;

    uiItemDictionary.TryGetValue (item, out go); 
    if(go == null)
    { 
     uiItemDictionary.Add(item,itemGameObject);
     go = NGUITools.AddChild(this.gameObject,itemGameObject);
    }
  [...]
}

Какие-либо предложения? Есть ли что-то еще, что мне нужно переопределить?

Спасибо,

Крис


  • Какой именно тип словаря вы используете? 20.03.2014
  • System.Collection.Generic.Dictionary‹Item, GameObject› uiItemDictionary = new Dictionary‹Item, GameObject›(); 20.03.2014

Ответы:


1

Попробуйте переопределить Equals как таковой:

public override bool Equals(object obj)
{
    var myItem = obj as Item;
    return !ReferenceEquals(myItem, null) && Equals(myItem);
}

public bool Equals(Item myItem)
{
    return string.Equals(name, myItem.name, StringComparison.Ordinal) && string.Equals(itemType, myItem.itemType, StringComparison.Ordinal);
}
20.03.2014
  • Кажется, это работает. Можете ли вы объяснить, почему мое переопределение bool Equals() неадекватно? Просто пытаюсь понять, почему это может быть необходимо, а не мое переопределение. 20.03.2014
  • Ну, здесь object.Equals используется для проверки на равенство, которая выполняется после использования хэш-кода для поиска ключей-кандидатов в словаре. Затем следует вызывать только метод Equals, чтобы утверждать, что они на самом деле равны. 20.03.2014
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..