c# - 无法从列表中删除元素

标签 c# unity-game-engine

我正在 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++;
}

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

最佳答案

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

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

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

关于c# - 无法从列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41764109/

相关文章:

C# linq 选择列表中的对象查看另一个对象列表

c# - 多线程 - 5 或 100 个线程?

unity-game-engine - 用于选择要调用的函数的检查器变量 (Unity3D)

c# - 在编辑器中分配脚本而不是游戏对象?

c# - 绑定(bind)手势识别器

c# - PowerPoint 互操作程序集缓慢问题

c# - jquery 幻灯片放映。确定您所在的幻灯片 AKA Div

java - OpenCV 结构光 getProjPixel() 示例

android - build.gradle 和 Manifest 文件丢失了吗?

ios - FacebookSDK for Unity iOS Mach-O 链接器错误 - undefined symbol _iosLogin,