- Home /
 
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
Answer by Bonfire-Boy · Nov 24, 2015 at 01:29 PM
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.
Your answer
 
             Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
Grab a specific item from a list 3 Answers
Adding object to list add the same object to another list 1 Answer
Illuminating a 3D object's edges OnMouseOver (script in c#)? 1 Answer