Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t从列表中删除元素_C#_Unity3d - Fatal编程技术网

C# Can';t从列表中删除元素

C# Can';t从列表中删除元素,c#,unity3d,C#,Unity3d,我正在Unity中开发一个游戏,我想从列表中删除一个元素。但是当我调用List.Remove(T)方法时,它不会删除任何内容 private void OnMouseDown() { Debug.Log("Clicked for mixing"); foreach (Element element in ElementsControl.elements) { if (element.composition.Length > 1) {

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

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

您不能删除任何内容,因为
remElem
a
中是引用,但您将其从另一个列表中删除。即使对象具有相同的值,引用也不同。
cauldron.getElements()
中没有与
remElem
相等的引用

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");
        }
    }
}
您应该编写一些查询来执行此操作:

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

但它会删除所有元素

要仅删除一个,应执行以下操作:

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++;
    }
}

什么是元素?您是否调试过它并确保列表中存在相同的元素?
cauldron.getElements()
可能会创建一个新的列表,然后将其丢弃。在您的代码中,只有当
remElem.Equals(compElement)==true时,才会删除该列表,这解决了该问题,但它会删除列表中所有匹配的元素,并且,我只想移除2个氢元素,1个氧元素,当我尝试添加2个氧元素和2个氢元素时,我调用移除,它会删除所有4个元素,而不是我想要的3个元素。这是元素类: