Jump to content
Sign in to follow this  
Megadok

Duda sobre Listas.

Recommended Posts

Muy buenas a todos!

Estoy un poco dudoso con respecto a la referenciación entre listas.Me explico.

Tengo una lista de la clase "objeto"  List<objeto> lista_de_objetos;
Los objetos tienen tipología, unos son "consumibles" y otros son "equipables".

Entonces quiero crear una lista de solamente objetos "equipables", PERO, que estén referenciada con la lista_de_objetos principal, que si elimino un objeto de la lista de equipo, se elimine también en la principal. He probado a copiar la lista pero necesito que en la lista de equipo solo estén los objetos del tipo "equipo".

Gracias!

Share this post


Link to post
Share on other sites

A la hora de meter los objetos en la lista, pues los filtras.

ejemplo:

public void FillWithFilter (Tipo tipoObjeto, objetos) {
	for(int i = 0; i < objetos.count; i++){
    	if(objetos[i].tipo == tipoObjeto){
        	listaFiltrada.add(objetos[i]);
        }
    }
}

PD: Escrito desde el móvil, es posible que tenga algún error

Edited by leocub58

Share this post


Link to post
Share on other sites

Gracias , pero me gustaría que si elimino un objeto de la listaFiltrada, se elimine de la lista objetos principal.

Share this post


Link to post
Share on other sites

Puedes hacer este comportamiento con IEnumerables, pero recuerda, la lista "Original" es quien puede alterarse.

  1. Creas una clase llamada ItemCollection (o como quieras)
  2. Creas una lista privada, 1 función para añadir elementos, 1 para eliminar elementos y una para iterar elementos.
  3. Creas IReadOnlyList<Item> de los elementos que necesites. 
public class ItemCollection<T> : where T : class, new ()
{
    private List<T> m_collection { get; set; } = new List<T> ();

    public void Add (T item)
    {
        m_collection.Add (item);
    }

    public void Remove (T item)
    {
        m_collection.Remove (item);
    }

    public void Remove (Predicate<T> predicate)
    {
        for (int i = 0; i < m_collection.Count; i++)
        {
            if (predicate (m_collection[i]))
            {
                m_collection.RemoveAt (i);
                i = 0;
            }
        }
    }

    public IEnumerable<T> Where (Predicate<T> predicate)
    {
        for (int i = 0; i < m_collection.Count; i++)
            if (predicate (m_collection[i]))
                yield return m_collection[i];
    }
}

public class Item
{
    public int Type = 0;
    public string Name = "";
}

public class ItemA : Item { }
public class ItemB : Item { }

public class Controller : MonoBehaviour
{
    public ItemCollection<Item> ItemsDB { get; private set; } = new ItemCollection<Item> ();

    public IReadOnlyList<ItemA> ItemsA => ItemsDB.Where (x => typeof (ItemA).IsInstanceOfType (x));
    public IReadOnlyList<ItemB> ItemsB => ItemsDB.Where (x => typeof (ItemB).IsInstanceOfType (x));

    private void OnGUI ()
    {
        foreach (Item item in ItemsA)
        {
            if (GUILayout.Button (item.Name))
                ItemsDB.Remove (item);
        }

        foreach (Item item in ItemsB)
        {
            if (GUILayout.Button (item.Name))
                ItemsDB.Remove (item);
        }
    }
}

 

Share this post


Link to post
Share on other sites
On 11/30/2020 at 11:16 PM, francoe1 said:

Puedes hacer este comportamiento con IEnumerables, pero recuerda, la lista "Original" es quien puede alterarse.

  1. Creas una clase llamada ItemCollection (o como quieras)
  2. Creas una lista privada, 1 función para añadir elementos, 1 para eliminar elementos y una para iterar elementos.
  3. Creas IReadOnlyList<Item> de los elementos que necesites. 

public class ItemCollection<T> : where T : class, new ()
{
    private List<T> m_collection { get; set; } = new List<T> ();

    public void Add (T item)
    {
        m_collection.Add (item);
    }

    public void Remove (T item)
    {
        m_collection.Remove (item);
    }

    public void Remove (Predicate<T> predicate)
    {
        for (int i = 0; i < m_collection.Count; i++)
        {
            if (predicate (m_collection[i]))
            {
                m_collection.RemoveAt (i);
                i = 0;
            }
        }
    }

    public IEnumerable<T> Where (Predicate<T> predicate)
    {
        for (int i = 0; i < m_collection.Count; i++)
            if (predicate (m_collection[i]))
                yield return m_collection[i];
    }
}

public class Item
{
    public int Type = 0;
    public string Name = "";
}

public class ItemA : Item { }
public class ItemB : Item { }

public class Controller : MonoBehaviour
{
    public ItemCollection<Item> ItemsDB { get; private set; } = new ItemCollection<Item> ();

    public IReadOnlyList<ItemA> ItemsA => ItemsDB.Where (x => typeof (ItemA).IsInstanceOfType (x));
    public IReadOnlyList<ItemB> ItemsB => ItemsDB.Where (x => typeof (ItemB).IsInstanceOfType (x));

    private void OnGUI ()
    {
        foreach (Item item in ItemsA)
        {
            if (GUILayout.Button (item.Name))
                ItemsDB.Remove (item);
        }

        foreach (Item item in ItemsB)
        {
            if (GUILayout.Button (item.Name))
                ItemsDB.Remove (item);
        }
    }
}

 

Más claro el agua. Muchísimas gracias por tan tamaña explicación.

  • Thanks 1

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...