Megadok 9 Report post Posted November 30, 2020 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
leocub58 208 Report post Posted November 30, 2020 (edited) 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 November 30, 2020 by leocub58 Share this post Link to post Share on other sites
Megadok 9 Report post Posted November 30, 2020 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
francoe1 536 Report post Posted November 30, 2020 Puedes hacer este comportamiento con IEnumerables, pero recuerda, la lista "Original" es quien puede alterarse. Creas una clase llamada ItemCollection (o como quieras) Creas una lista privada, 1 función para añadir elementos, 1 para eliminar elementos y una para iterar elementos. 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
iRobb 775 Report post Posted December 2, 2020 Eres un crack @francoe1. Muy elegante tu estilo de código. 1 Share this post Link to post Share on other sites
Megadok 9 Report post Posted December 5, 2020 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. Creas una clase llamada ItemCollection (o como quieras) Creas una lista privada, 1 función para añadir elementos, 1 para eliminar elementos y una para iterar elementos. 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. 1 Share this post Link to post Share on other sites