Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Buscar objetos dentro de una lista...

Iniciado por Bydark, Abril 19, 2017, 02:01:30 AM

Tema anterior - Siguiente tema
Abril 19, 2017, 02:01:30 AM Ultima modificación: Abril 19, 2017, 01:03:48 PM por pioj
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:
 



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

[/quote]
 
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.

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
 
 

Abril 19, 2017, 10:48:35 AM #2 Ultima modificación: Abril 19, 2017, 10:48:59 AM por Luis_arg
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 ...
 
 

Cita de: lightbug date=1492562756Hola, 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..
 
 
 
 
 

Cita de: Luis_arg date=1492591715Es 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
 
 
 
 
 
 
 
 
 

Abril 19, 2017, 03:06:48 PM #4 Ultima modificación: Abril 19, 2017, 10:38:00 PM por pioj
Cita de: Bydark date=1492598923Antes 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..
   
   
       
   
   
       
   
   
      
   
   
      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
   
   
       
   
   
       
   
   
       
   
   
       
   
   
      
   


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
   
   
       
   
   
      }
   
   
   
   
       
   

[/quote]
 
 

Cita de: Bydark date=1492598923He 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.

Abril 19, 2017, 08:25:46 PM #6 Ultima modificación: Abril 19, 2017, 08:32:07 PM por Bydark
Cita de: Luis_arg date=1492607208Inventario.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> ();
 
 
 
 
 
 
 

Abril 19, 2017, 10:58:38 PM #7 Ultima modificación: Abril 20, 2017, 02:00:14 AM por pioj
Cita de: Bydark date=1492626346Creo 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:
 



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

[/quote]
 
 

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/

Cita de: juanma_teso date=1492635567Las 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.

Abril 20, 2017, 12:00:42 AM #10 Ultima modificación: Abril 20, 2017, 12:01:24 AM por TheBullet
Cita de: Bydark date=1492636441Gracias, 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.

Cita de: Bydark date=1492626346PD: 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 ^.^

Abril 20, 2017, 01:06:00 AM #12 Ultima modificación: Abril 20, 2017, 01:06:34 AM por Bydark
Cita de: Arthure date=1492640249buffff 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.

Cita de: juanma_teso date=1492635567Te dejo una página que te será muy útil:
   
   
      http://csharp.com.es/
   


Muy buena pagina
 
 

Etiquetas: