无法从列表中删除元素

时间:2017-01-20 12:48:37

标签: c# unity3d

我正在Unity开发游戏,我想从列表中删除一个元素。但是当我调用方法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");
        }
    }
}

问题出在以下几行:

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

当我尝试删除它时,列表保持原样,不删除任何内容。

1 个答案:

答案 0 :(得分:0)

您无法删除任何内容,因为axis中的remElem是引用,但您将其从其他列表中删除。即使对象具有相同的值,引用也是不同的。 a中没有等同于remElem的引用。

您应该编写一些查询来执行此操作:

cauldron.getElements()

您应该在cauldron.getElements().RemoveAll((e) => e.Id == remElem.Id); // or other field or fields 中找到与remElem具有相同值的对象,然后将其从该列表中删除。

但它会删除所有元素。

只删除您应该执行的操作:

cauldron.getElements()