简体   繁体   English

无法从列表中删除元素

[英]Can't remove element from list

I'm developing a game in Unity, and I want to remove an element from a list. 我正在Unity中开发游戏,我想从列表中删除一个元素。 But when I call the method List<T>.Remove(T) , it doesn't remove anything. 但是,当我调用方法List<T>.Remove(T) ,它不会删除任何内容。

private void OnMouseDown()
{
    Debug.Log("Clicked for mixing");
    foreach (Element element in ElementsControl.elements)
    {
        if (element.composition.Length > 1)
        {
            Debug.Log("FINE. Element is not pure");
            List<Element> a = new List<Element>();
            foreach (Element compElement in element.getRawComposition())
            {
                a.Add(compElement);
            }
            string allComposition = "";
            foreach (Element dispElement in a)
            {
                if (allComposition == "")
                    allComposition = dispElement.name;
                else
                    allComposition += " + " + dispElement.name;
            }
            Debug.Log(element.name + " composition is: " + allComposition);
            string cauldElements = "";
            foreach (Element cauldElem in cauldron.getElements())
            {
                if (cauldElements == "")
                    cauldElements = cauldElem.name;
                else
                    cauldElements += " + " + cauldElem.name;
            }
            Debug.Log("Cauldron has: " + cauldElements);
            if (ContainsAllItems(cauldron.getElements(), a))
            {
                Debug.Log("OK. Mix result is " + element.name + ", used " + a);
                Debug.Log("Removing " + a.Count + " elements from cauldron");
                int counter = 0;
                foreach (Element remElem in a)
                {
                    cauldron.getElements().Remove(remElem);
                    Debug.Log("Removed " + remElem + " from cauldron");
                    counter++;
                }
                Debug.Log("Removed " + counter + " elements from cauldron");
                Debug.Log("Adding " + element + " to cauldron");
                cauldron.getElements().Add(element);
                return;
            }
            else
                Debug.Log("NO. Mix result not ok");
        }
    }
}

The problem comes in these lines: 问题出在以下几行:

foreach (Element remElem in a)
{
  cauldron.getElements().Remove(remElem);
  Debug.Log("Removed " + remElem + " from cauldron");
  counter++;
}

When I try to delete it, the list stays as it, without deleting anything. 当我尝试删除它时,列表保持不变,但不删除任何内容。

You can't delete anything because remElem is reference in a but you delete it from another list. 您不能删除任何东西,因为remElem是参考a但你从另一个列表中删除。 Even if objects has same values, the references are different. 即使对象具有相同的值,引用也不同。 There is no reference equal to remElem in cauldron.getElements() . cauldron.getElements()没有等于remElem引用。

You should write some query to do it: 您应该编写一些查询来做到这一点:

cauldron.getElements().RemoveAll((e) => e.Id == remElem.Id); // or other field or fields

You should find object that has same values as remElem in cauldron.getElements() and then delete it from that list. 您应该在cauldron.getElements()找到与remElem具有相同值的对象,然后从该列表remElem其删除。

But it deletes all elements. 但是它将删除所有元素。

To delete only one you should do: 要仅删除一个,您应该执行以下操作:

var list = cauldron.getElements();
foreach (Element remElem in a)
{
    var elems = list.Where((e) => e.Id == remElem.Id);
    if (elems.Any())
    {
        list.Remove(elems.ElementAt(0));
        Debug.Log("Removed " + remElem + " from cauldron");
        counter++;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM