- Home /
Check List<> for 'Item'
I have a class 'Item', and a List of 'Items' (Inventory). I have a vehicle I wish to require a key to activate.
I have a shop where the key is obtainable and this part works - adds the Item 'Key' to the Inv list. It is when I check for the item that I hit my snag:
if(Inventory._Inv.Contains (key)){
Debug.Log("Key Accepted");
}
Inventory._Inv is a public static List (for testing purposes) and 'key' is a new Item defined at start with the same arguments as the item in the shop.
I do not get the debug message "Key Accepted" - any ideas?
I feel I'm either using Contains() wrong, or I am having a problem because 'key' is defined as a new Item, but I don't know how to define it without the new keyword.
Thanks
Answer by ArkaneX · Feb 02, 2014 at 10:18 PM
If key is a class, then by default it is compared by reference, so Contains will return true only if you pass to it the same instance that was added to the list.
To change this behaviour, you can override Equals method of Key class, or eventually use struct instead of class (if possible).
Passing the same instance is exactly what I would like to do - how can I do this? Thanks
If the key can be bought in a shop, then it means you added it to the shop in some part of the code. I suggest creating a static dictionary of cars and matching keys (for example in a Car$$anonymous$$anager
class), and for each available car add it to the dictionary with its key. And then add the keys from this dictionary to your shop.
public static Dictionary<Car, $$anonymous$$ey> DicCarsAnd$$anonymous$$eys;
void Awake()
{
DicCarsAnd$$anonymous$$eys = new Dictionary<Car, $$anonymous$$ey>();
var porsche = Instantiate(PorschePrefab) as Car;
var porsche$$anonymous$$ey = new $$anonymous$$ey(); // this has to be added to the shop as well
DicCarsAnd$$anonymous$$eys.Add(porsche, porsche$$anonymous$$ey);
}
and when you enter a car later, you can get the $$anonymous$$ey instance from this dictionary, and test if you have it in the inventory:
var key = Car$$anonymous$$anager.DicCarsAnd$$anonymous$$eys[car];
if(Inventory._Inv.Contains (key))
{
Debug.Log("$$anonymous$$ey Accepted");
}
Thats perfect, thanks! I'll give that a go when I get home and tick as answered if (when) it works.