Jump to content
Bydark

Buscar objetos dentro de una lista...

Recommended Posts

Muy buenas, estoy creando un inventario a traves de una lista y no encuentro la manera de comprobar si un objeto existe en el inventario, la lista la he creado así:

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

public class Inventory {

    public string name;
    public int health;

    public Inventory(string newName, int newHealth)    {
        name = newName;
        health = newHealth;
    }
}

 

Para añadir un objeto lo que hago es esto:

Cita

 

List<Inventory> inventario = new List<Inventory> ();
        inventario.Add (new Inventory ("Manzana", 1));


 

Donde manzana es el nombre del objeto y 1 su poder de salud (health en el código de arriba).

Lo que intento es saber como buscar en mi lista si por ejemplo tengo una manzana pero no encuentro el comando adecuado, alguna idea?? :S

Muchísimas gracias.

 

PD: El primer código y el segundo están en scripts distintos, aunque no creo que eso suponga ningún problema al declarar las variables públicas.

Edited by pioj
uso de tags y <> para pegar código.

Share this post


Link to post
Share on other sites

Hola, primero dejame decirte que meter en tu inventario un objeto de tipo "Inventory" es total y absolutamente confuso, yo usaria un nombre como Item o algo asi ya que cualquiera que lee pensara que estas creando un inventario, pero bueno si funciona para vos esta bien.

Podes realizar la busqueda iterando en un for o un foreach, si lo que te interesa ademas de saber si esta o no es algun otro dato como la posicion y esas cosas te recomiendo un for:

bool EncontrarObjInventario(string nombreDeseado){
  for(int i= ; i < inventario .Count ;i++){
    if(inventario[i].name == nombreDeseado){ 
      return true;
    }
  }
  return false;
}
  
                             
                             

Saludos

 

Share this post


Link to post
Share on other sites

Es sencillo en C# usas Inventario.Find() ... adentro de find pones el objeto "Inventory" que queres buscar ...

Sino otra mas fácil es usar Inventario.FindIndex() si encuentra el objeto te devuelve la posición del objeto sino lo encuentra te devuelve -1 ...

 

Edited by Luis_arg

Share this post


Link to post
Share on other sites
hace 9 horas, lightbug said:

Hola, primero dejame decirte que meter en tu inventario un objeto de tipo "Inventory" es total y absolutamente confuso, yo usaria un nombre como Item o algo asi ya que cualquiera que lee pensara que estas creando un inventario, pero bueno si funciona para vos esta bien.

Podes realizar la busqueda iterando en un for o un foreach, si lo que te interesa ademas de saber si esta o no es algun otro dato como la posicion y esas cosas te recomiendo un for:


bool EncontrarObjInventario(string nombreDeseado){
  for(int i= ; i < inventario .Count ;i++){
    if(inventario[i].name == nombreDeseado){ 
      return true;
    }
  }
  return false;
}
  
                             
                             

Saludos

 

Antes de nada muchas gracias por tomarte la molestia de contestar.

 

He probado con tu código pero no sé por qué al ponerlo me dice en el código que hay antes (lo que hay por encima de tú código) que se esperaba un } .

 

Creo que algo está fallando aunque no sé que es..

 

 

script.png

hace 2 horas, Luis_arg said:

Es sencillo en C# usas Inventario.Find() ... adentro de find pones el objeto "Inventory" que queres buscar ...

Sino otra mas fácil es usar Inventario.FindIndex() si encuentra el objeto te devuelve la posición del objeto sino lo encuentra te devuelve -1 ...

 

También te agradezco enormemente a ti la ayuda, aunque debo de ser muy manco porque tampoco he conseguido que me funcione, te paso una imagen vale?

 

Definitivamente algo estoy haciendo mal, no sé si me estoy liando a la hora de agregar el elemento al inventario...realmente no lo sé :S

 

 

 

 

script2.png

Share this post


Link to post
Share on other sites
hace 9 horas, Bydark said:

Antes de nada muchas gracias por tomarte la molestia de contestar.

 

He probado con tu código pero no sé por qué al ponerlo me dice en el código que hay antes (lo que hay por encima de tú código) que se esperaba un } .

 

Creo que algo está fallando aunque no sé que es..

 

 

script.png

También te agradezco enormemente a ti la ayuda, aunque debo de ser muy manco porque tampoco he conseguido que me funcione, te paso una imagen vale?

 

Definitivamente algo estoy haciendo mal, no sé si me estoy liando a la hora de agregar el elemento al inventario...realmente no lo sé :S

 

 

 

 

script2.png

Inventario.Add te faltan argumentos para llamar al constructor... según el código que pones arriba inventario.Add(new Inventory ("Manzana",1)  debería funcionar ... 

Si escribes inventario.Add( ... en ese momento te debería decir los atributos que tenes que pesarle al Constructor ... 

Al inventario.find le estas pasando un string con el nombre del objeto ... tendrías que pasarle un objeto de tipo Inventory ...

 

La idea es usar Lista.FindIndex( Objeto que queres buscar) 

seria :

Cita

 

Inventory InvObj = new Inventory("Manzana",1); // bueno la idea acá es poner en I el objeto a buscar ... creo uno como supongo que se crea ... sin conocer los argumentos que pide el constructor ...

if (Lista.FindIndex(InvObj) != -1){

  //esta en la lista

 

}else {

 

//no esta en la lista

 

}


 

 

Share this post


Link to post
Share on other sites
10 hours ago, Bydark said:

He probado con tu código pero no sé por qué al ponerlo me dice en el código que hay antes (lo que hay por encima de tú código) que se esperaba un } .

Vamooos @Bydark media piilaaaa jajaj si te dice eso es porque abriste (vos o yo, no importa) una llave y no la cerraste, o abris/cerraste llaves de mas. Pero en este caso estas cometiendo un horror imperdonable que es meter la definicion de una funcion dentro de una funcion, fijate que donde haces el inventory.add( .. seguramente sea en Start() o Awake(), y dentro estas poniendo la definicion funcion que te pase, tiene que estar fuera!! entonces la llamas desde donde queras dentro de Start, Awake, Update o cualquier metodo y te va a devolver true o false.

Share this post


Link to post
Share on other sites
hace 5 horas, Luis_arg said:

Inventario.Add te faltan argumentos para llamar al constructor... según el código que pones arriba inventario.Add(new Inventory ("Manzana",1)  debería funcionar ... 

Si escribes inventario.Add( ... en ese momento te debería decir los atributos que tenes que pesarle al Constructor ... 

Al inventario.find le estas pasando un string con el nombre del objeto ... tendrías que pasarle un objeto de tipo Inventory ...

 

 

 

 

La idea es usar Lista.FindIndex( Objeto que queres buscar) 

seria :

Inventory InvObj = new Inventory("Manzana",1); // bueno la idea acá es poner en I el objeto a buscar ... creo uno como supongo que se crea ... sin conocer los argumentos que pide el constructor ...

if (Lista.FindIndex(InvObj) != -1){

  //esta en la lista

 

}else {

 

//no esta en la lista

 

}

 

 

Creo que me estoy volviendo loco jajajaja, estoy intentándolo con tu método ( el del amigo @lightbug se escapa a mi conocimiento ) y no encuentro la manera, no sé ya como hacerlo, te paso una foto para que veas el error que tengo..desde ya mil gracias y siento mi torpeza.

 

PD: Que es lo que hace esta linea? :

Inventory InvObj = new Inventory("Manzana",1);

 

Y esta? Estoy ya hecho un lío, no sé cual debo dejar de las dos...

List<Inventory> inventario = new List<Inventory> ();

 

 

 

script3.png

Edited by Bydark

Share this post


Link to post
Share on other sites
hace 5 horas, Bydark said:

Creo que me estoy volviendo loco jajajaja, estoy intentándolo con tu método ( el del amigo @lightbug se escapa a mi conocimiento ) y no encuentro la manera, no sé ya como hacerlo, te paso una foto para que veas el error que tengo..desde ya mil gracias y siento mi torpeza.

 

PD: Que es lo que hace esta linea? :

Inventory InvObj = new Inventory("Manzana",1);

 

Y esta? Estoy ya hecho un lío, no sé cual debo dejar de las dos...

List<Inventory> inventario = new List<Inventory> ();

 

 

 

te da error ... porque esta buscando en un Objeto de tipo Inventory ...

El FindIndex ... tenes que hacerlo en la lista ... 

entonces : 

Ahora tenes el InvObj (el objeto que vas a buscar)

En la lista de objetos ... 

entonces quedaría:

Cita

 

If (ListadeObjetosInventory.FindIndex(InvObj) != -1){

}

 

 

Share this post


Link to post
Share on other sites

Las funciones Find / FindIndex y similares de la clase List no toman un elemento del tipo Inventory en tu caso, lo que reciben es un delegado, es algo un poco más avanzado, la solución que te da @lightbug al principio es más sencilla, si quieres saber si tienes una manzana usando esas funciones sería del estilo:

void Buscar (string nombre)
{
	Inventory item = inventario.Find(x=> x.name == nombre);
}

Ahora en la variable item tienes tu manzana o null, puedes borrar el item del inventario si lo has usado.

Te dejo una página que te será muy útil:

http://csharp.com.es/

Share this post


Link to post
Share on other sites
hace 13 minutos, juanma_teso said:

Las funciones Find / FindIndex y similares de la clase List no toman un elemento del tipo Inventory en tu caso, lo que reciben es un delegado, es algo un poco más avanzado, la solución que te da @lightbug al principio es más sencilla, si quieres saber si tienes una manzana usando esas funciones sería del estilo:


void Buscar (string nombre)
{
	Inventory item = inventario.Find(x=> x.name == nombre);
}

Ahora en la variable item tienes tu manzana o null, puedes borrar el item del inventario si lo has usado.

Te dejo una página que te será muy útil:

http://csharp.com.es/

Gracias, me gustaría decirte que me ha funcionado pero al no comprender el funcionamiento no sé como llevarlo a cabo, a partir de ahí no sé como hacer un If en el que si tengo una manzana haga una cosa u otra.

 

La manzana tendrá que estar ya en la lista para que se transforme en el item, no? Menudo lío llevo..

 

Muchas gracias por la paciencia.

Share this post


Link to post
Share on other sites
hace 47 minutos, Bydark said:

Gracias, me gustaría decirte que me ha funcionado pero al no comprender el funcionamiento no sé como llevarlo a cabo, a partir de ahí no sé como hacer un If en el que si tengo una manzana haga una cosa u otra.

 

La manzana tendrá que estar ya en la lista para que se transforme en el item, no? Menudo lío llevo..

 

Muchas gracias por la paciencia.

Inventory item = inventario.Find(x=> x.name == nombre);

if(item == null){
	//No hay item
}
else{
	//Lo ha encontrado. Aquí haces lo que quieras...
}

Te recomendaría que para items utilizaras Scriptable Objects, te será más fácil de manejar. Puedes buscar tutoriales en YouTube.

Edited by TheBullet

Share this post


Link to post
Share on other sites
hace 3 horas, Bydark said:

PD: Que es lo que hace esta linea? :

Inventory InvObj = new Inventory("Manzana",1);

 

Y esta? Estoy ya hecho un lío, no sé cual debo dejar de las dos...

List<Inventory> inventario = new List<Inventory> ();

buffff si de verdad estas preguntando lo que hacen esas dos lineas ... no es por nada, pero apaga y vamonos xDDD Quiero creer que es una coña ^.^

Share this post


Link to post
Share on other sites
hace 49 minutos, Arthure said:

buffff si de verdad estas preguntando lo que hacen esas dos lineas ... no es por nada, pero apaga y vamonos xDDD Quiero creer que es una coña ^.^

Lo sé, llevo sólo unos días programando en C# y estoy corriendo más de lo que debería, de todas formas muchas gracias a todos, al final he conseguido hacer lo que quería con la ayuda final de @TheBullet , la verdad es que marcaría todas las respuestas como correctas, porque todas lo son, pero la única que he sabido entender ha sido la suya.

 

Gracias a todos de nuevo.

Edited by Bydark

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...