Я пытаюсь выполнить поиск по словарю с помощью 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);
}
[...]
}
Какие-либо предложения? Есть ли что-то еще, что мне нужно переопределить?
Спасибо,
Крис
object.Equals
используется для проверки на равенство, которая выполняется после использования хэш-кода для поиска ключей-кандидатов в словаре. Затем следует вызывать только методEquals
, чтобы утверждать, что они на самом деле равны. 20.03.2014