List.Contains Problem

Hi, Im testing this script that I’ll use in my game but I have a problem on list. I make a small script that will test my code but I don’t know how to check if the list already contains this class or inputs. Here is my code

using UnityEngine;
using System.Collections.Generic;
 
public class Name : MonoBehaviour
{
    public List<NameClass> ListOfName;
 
    void Awake ()
    {
        ListOfName = new List<NameClass> ();
    }
 
    void Update ()
    {
        if (Input.GetButtonDown ("Horizontal"))
        {
            foreach (NameClass nc in ListOfName)
            {
                Debug.Log(nc.Name);
                Debug.Log(nc.Age);
            }
        }
 
        if (!ListOfName.Contains(new NameClass("mark", 1)))
        {
            ListOfName.Add (new NameClass("mark", 1));
        }
    }
 
}
 
public class NameClass
{
    public string Name { get; set; }
    public int Age { get; set; }
 
    public NameClass (string name, int age)
    {
        Name = name;
        Age = age;
    }
}

in update it will add new NameClass(“mark”, 1) if the list doesnt contains this class or same input. how can i correctly do it? thanks

In this…

if (!ListOfName.Contains(new NameClass("mark", 1)))
{
     ListOfName.Add (new NameClass("mark", 1));
}

You create a new NameClass, and look to see if it’s in the list. It can’t be, because you only just created it. The point is, Contains is looking to see if that particular object is in the list, not for an object with the same values as that one.

To check if your list already contains a NameClass with certain values, you need to look at and compare those values. You could for example create a function something like this…

bool Contains( List<NameClass> list, NameClass nameClass)
{
   foreach (NameClass n in list)
   { 
      if (n.Name == nameClass.Name && n.Age == nameclass.Age)
       { return true; }
   }
   return false;
}

and then

NameClass nc = new NameClass("mark", 1);
if (!Contains(ListOfName, nc))
{
         ListOfName.Add (nc);
}

There will be more clever ways of doing this but I think the main point to get across here is that testing the equality of variables of class types tests if they are the same object, not if they have the same values. The latter is something which, generally speaking, you have to implement yourself.